7

我试图理解他在“ A Block Costumecloaker ”中所写的_why的方法:

class HTML
  def cloaker &blk
    (class << self; self; end).class_eval do
      # ... rest of method
    end
  end
end

我意识到class << self; self; end打开 的 Eigenclass self,但我之前从未见过有人在实例方法中这样做。我们这样做的目的是self什么?我的印象self应该是调用该方法的接收者,但从cloaker内部调用method_missing

def method_missing tag, text = nil, &blk
  # ...
  if blk
    cloaker(&blk).bind(self).call
  end
  # ...
end

那么调用self里面是什么method_missingself当我们调用时是什么:

((class << self; self; end).class_eval)

方法里面cloaker

基本上,我想知道我们是打开 HTML 类的 Eignenclass,还是打开 HTML 类的特定实例?

4

1 回答 1

1

cloaker方法内部,self将是一个 HTML 实例,因为您将在一个对象上调用它,因此您实际上是在 HTML 类实例上创建了一个单例方法。例如:

class HTML
  def cloaker &blk
    (class << self; self; end).class_eval do
      def new_method
      end
    end
  end
end

obj = HTML.new
obj.cloaker
p HTML.methods.grep /new_method/  # []
p obj.singleton_methods # [:new_method]

编辑

或者正如 Jörg W Mittag 评论的那样,只是 1.9 之前的调用方式"Object#define_singleton_method"

于 2013-05-08T14:07:28.047 回答