我不明白如何使用binding
和eval
从方法外部更改变量值。
示例方法:
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
如何在方法外设置方法局部变量的新值?谢谢。
答案 0 :(得分:1)
在您的示例中,您始终通过调用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