Ruby:了解_why的cloaker方法

时间:2013-05-08 13:13:25

标签: ruby

我试图理解他在“A Block Costume”中写过的_why的cloaker方法:

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

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

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

那么self电话中的method_missing是什么?当我们打电话时self是什么:

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

cloaker方法中?

基本上,我想知道我们是否打开HTML类的Eignenclass,或者我们是否正在对HTML类的特定实例进行操作?

1 个答案:

答案 0 :(得分:1)

cloaker方法中,self将是HTML的一个实例,因为您将在对象上调用它,因此您可以在HTML类实例上有效地创建Singleton方法。例如:

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örgWMittag评论的那样,只有1.9版之前的呼叫"Object#define_singleton_method"