我讀編程的Ruby 1.9的元編程節,我無法理解這是怎麼回事內部class_eval
/class_exec
與instance_eval
/instance_exec
之間。Ruby的清晰度和instance_eval的對比class_eval
所以首先,我的理解是,def
增加了一個方法的self
方法表(類對象):
class A
puts self # => A
def foo; 42; end # added to the method table of self, so becomes an instance method
end
A.new.foo # => 42
如果我們使用class_eval
,我們得到了相同的行爲:
A.class_eval do
puts self # => A
def bar; 42; end # same as above
end
A.new.bar # => 42
但不知何故,在instance_eval
情況下,情況就不同了:
A.instance_eval do
puts self # => A
def baz; 42; end # added to the method table of an anonymous
# singleton class of self, so becomes a class method
end
puts A.baz # => 42
s = 'string'
s.instance_eval do ... end # same behavior, so now def creates an instance method
因此,我瞭解class_eval
和instance_eval
之間的功能差異。
但class_eval
和instance_eval
塊內的上下文看完全相同我也一樣 - 特別是self
指向同一個對象,而local_variables
是相同的。那麼塊(內部)內部發生什麼,使def
的行爲有所不同?
是否有一些文件可以閱讀? instance_eval和class_eval的RDoc不起作用。看看源代碼,instance_eval似乎設置了一個singleton類對象,而class_eval沒有 - 但是這種區別在C代碼之外,在Ruby級別上是可見的嗎?
嗯,我明白了 - 這是有道理的。有什麼方法可以檢查Ruby代碼中的「當前類」嗎? – 2010-12-10 13:25:08
我認爲在'A.instance_eval'中,你打算寫'#defs在這裏去A的本徵類?還是我誤會了? – 2010-12-10 13:33:27
這並不簡單,我會在答案 – 2010-12-10 13:36:42