我对ruby中块绑定的定义感到困惑。这是两个样本:
def redfine_a(&block)
a = 2
puts eval("a", block.binding)
block.call
end
a = "hello"
puts redfine_a {a}
这个可以运行预期的结果,而第二个:
def redefine_a(&block)
a= 2
puts eval("a", block.binding)
block.call
end
puts redefine_a{a= "hello"}
会抱怨:
undefined local variable or method `a' for main:Object (NameError)
删除puts eval("a", block.binding)
后,我的代码运行:
def redefine_a(&block)
a= 2
block.call
end
puts redefine_a{a= "hello"}
我哪里错了?
答案 0 :(得分:9)
block.binding
是在运行之前定义块的环境。
答案 1 :(得分:3)
在您的代码中,定义块的上下文是main
对象,因此行eval("a", block.binding)
将在a
中返回main
的值。在您的第一个示例中a
在main
中定义,因此代码运行,在第二个示例中,main中没有a
,因此错误。
但在这两种情况下,a=2
方法中的redefine_a
都无法生效。