我试图理解他在“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类的特定实例进行操作?
答案 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"