在Ruby中阻止绑定

eri*_*223 2 ruby binding

我对ruby中块绑定的定义感到困惑.这是两个样本:

def redfine_a(&block)
  a = 2
  puts eval("a", block.binding)
  block.call
end
a = "hello"
puts redfine_a {a}
Run Code Online (Sandbox Code Playgroud)

这个可以运行预期的结果,而第二个:

def redefine_a(&block)
  a= 2
  puts eval("a", block.binding)
  block.call
end

puts redefine_a{a= "hello"}
Run Code Online (Sandbox Code Playgroud)

会抱怨:

undefined local variable or method `a' for main:Object (NameError)
Run Code Online (Sandbox Code Playgroud)

删除后puts eval("a", block.binding),我的代码运行:

def redefine_a(&block)
  a= 2
  block.call
end

puts redefine_a{a= "hello"}
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

mck*_*eed 9

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