当将一个块传递给 instance_eval 时,它意味着在该实例的上下文中执行。self在该块中显式或隐式引用时,应引用已调用 instance_eval 的实例。这似乎在所有情况下都可以正常工作,除非传递已转换为 proc 的方法对象。在这种情况下,self指的是定义方法的实例,而不是评估块的实例。这是一个代码示例来演示我的意思:
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。
我查看了文档并进行了一些搜索,但我无法找到有关此特性的信息。我希望有一些经验丰富的 Ruby 专家可以帮助消除这种行为差异。
澄清一下,我使用的是 Ruby 1.9.2。