在Ruby中阻止绑定

时间:2010-07-18 05:34:49

标签: ruby binding

我对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"}

我哪里错了?

2 个答案:

答案 0 :(得分:9)

block.binding是在运行之前定义块的环境。

答案 1 :(得分:3)

在您的代码中,定义块的上下文是main对象,因此行eval("a", block.binding)将在a中返回main的值。在您的第一个示例中amain中定义,因此代码运行,在第二个示例中,main中没有a,因此错误。

但在这两种情况下,a=2方法中的redefine_a都无法生效。