將塊傳遞給instance_eval時,它意味着在該實例的上下文中執行。 self,當在該塊中顯式或隱式地引用時,應該引用instance_eval已被調用的實例。這似乎在所有情況下都可以正常工作,除了傳遞已轉換爲proc的方法對象時。在這種情況下,self引用方法定義的實例,而不是塊評估的實例。這裏有一個代碼示例來演示我的意思:與instance_eval的行爲不一致
class A
def test(&b)
instance_eval(&b)
end
end
class B
def test_a(a)
a.test { puts self }
end
def test_b_helper(*args)
puts self
end
def test_b(a)
m = method(:test_b_helper).to_proc
a.test(&m)
end
end
a = A.new
b = B.new
b.test_a(a) #<A:0x007ff66b086c68>
b.test_b(a) #<B:0x007fa3e1886bc0>
預期的行爲是爲兩個測試返回相同的輸出。在這種情況下,self應該指的是A的一個實例,而不是B.
我查看了文檔並完成了一些搜索,但是我一直未能找到有關此特性的信息。我希望有一些經驗豐富的Rubyist能夠幫助理清這種行爲差異。
爲了澄清,我使用的是Ruby 1.9.2。
@tabdulla:在我的回答中添加了一個清晰的示例。 – 2012-07-11 08:13:03