Ruby: 在方法外改变变量

Ruby: Changing the variable outside the method

我不明白如何使用 bindingeval 从方法外部更改变量值。 示例方法:

def foo
  a = 1
  binding
end

我可以通过两种方式获取变量a

foo.local_variable_get(:a) #=> 1
# or
foo.eval("a") #=> 1

但是我无法设置新值

foo.local_variable_set(:a, 2)
foo.local_variable_get(:a) #=> still 1
foo.eval("a = 2")
foo.local_variable_get(:a) #=> still 1

但是,如果 Binding 对象是在全局范围内在任何方法之外创建的,我可以这样做:

bar = 123
binding # Binding object with global scope
binding.eval("bar") #=> 123
binding.eval("bar = 456")
binding.eval("bar") #=> 456

如何在方法外部为方法局部变量设置新值?谢谢。

在您的示例中,您总是通过调用 foo 创建新的绑定(上下文)。这就是更改丢失的原因。

如果你调用相同的绑定应该可以工作

b = foo
b.local_variable_get(:a) # => 1

eval("a = 2", b)
b.local_variable_get(:a) # => 2

b.local_variable_set(:a, 3)
b.local_variable_get(:a) # => 3