Ruby: 在方法外改变变量
Ruby: Changing the variable outside the method
我不明白如何使用 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
如何在方法外部为方法局部变量设置新值?谢谢。
在您的示例中,您总是通过调用 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
我不明白如何使用 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
如何在方法外部为方法局部变量设置新值?谢谢。
在您的示例中,您总是通过调用 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