【发布时间】:2017-03-15 17:33:05
【问题描述】:
我不明白如何使用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
如何在方法外部为方法局部变量设置新值?谢谢。
【问题讨论】:
-
第一个问题是,为什么要从方法外部更改方法内部的局部变量?或许你不明白局部变量、实例变量、类变量和全局变量的区别?这听起来像一个“XY Problem”,你在问一件事,但实际上应该问另一件事。解释目标,为什么您希望能够在您的计划范围内做到这一点。
-
这没有任何意义。局部变量用于保存方法内部的值,这些值不需要方法外部的任何持久性。一旦方法退出,它们就会被销毁。您建议在方法中的哪个位置进行更改?在本地初始化时?在某个随机或任意位置的中游?我建议向我们展示一个代码 sn-p,展示您如何设想使用此类功能。
-
@theTinMan,我正在阅读这个 here 并在 irb 中尝试了类似的示例。我只是想了解它。
-
您是否注意到
local_variable_set和local_variable_get的使用发生在方法内部而不是外部?b.local_variable_set(:a, 2)是一种冗长的说法a = 2。使用这些方法可以让 Ruby 动态地执行代码,而无需任何源代码。 -
@theTinMan,是的,当然。但是当我将这些示例中的方法添加到 irb 之后尝试调用它时,它会导致错误“NoMethodError: undefined method local_variable_get for 3:Fixnum”,所以我认为变量
b有错误。然后我试图用方法之外的变量进行操作,发现我做不到。