我被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"}我哪里错了?
发布于 2010-07-18 13:41:53
block.binding是在块运行之前定义它的环境。
发布于 2010-07-18 20:45:28
在您的代码中,定义块的上下文是main对象,因此eval("a", block.binding)行将在main中返回a的值。在你的第一个例子中,a是在main中定义的,所以代码会运行,在第二个例子中,main中没有a,所以出现了错误。
不过,在这两种情况下,redefine_a方法中的a=2都不会有任何影响。
https://stackoverflow.com/questions/3274443
复制相似问题