2017-03-15 124 views
-2

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

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 

但是,如果绑定我能做到这一点对象是在全局范围内创建的,不包括任何方法:

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

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

+1

的第一个问题应该是工作,为什么你想从外面的方法中改变局部变量?也许你不明白本地,实例,类和全局变量之间的区别?这听起来像一个“[XY问题](https://meta.stackexchange.com/q/66377/153968)”,你在询问一件事情,但实际上应该询问另一件事情。解释目标,为什么你想在你的程序范围内做到这一点。 –

+0

这没有任何意义。局部变量用于在方法内部保存不需要任何持久化方法的值。只要方法退出,它们就会被销毁。你会在哪里建议在方法内进行这种改变?在本地初始化?在一些随机或任意点的中游?我建议向我们展示一段代码片段,展示如何使用这种功能。 –

+0

@theTinMan,我正在阅读有关[这里](https://ruby-doc.org/core-2.2.0/Binding.html#local_variable_set-method)并尝试在irb中使用类似的示例。我只是想了解它。 – tbard

回答

0

在您的示例中,您总是通过调用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