Ruby:在方法之外更改变量

时间:2017-03-15 17:33:06

标签: ruby binding eval

我不明白如何使用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

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

1 个答案:

答案 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