Ruby:在方法外部更改变量

Ruby:在方法外部更改变量,ruby,binding,eval,Ruby,Binding,Eval,我不明白如何使用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")

我不明白如何使用
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
但是,如果绑定对象是在全局范围内创建的,在任何方法之外,我都可以这样做:

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

第一个问题是为什么要从方法外部更改方法内部的局部变量?也许您不理解局部变量、实例变量、类变量和全局变量之间的区别?这听起来像是一个“你在问一件事,但实际上应该问另一件事”。解释你的目标,为什么你想在你的项目范围内做到这一点。这没有任何意义。局部变量用于保存方法内部的值,这些值在方法外部不需要任何持久性。一旦该方法退出,它们就会被销毁。您打算在方法内部的什么地方进行更改?在本地服务器初始化时?在某个随机或任意地点的中游?我建议您向我们展示一段代码片段,展示您对如何使用此类功能的设想。@theTinMan,我正在阅读相关内容,并在irb中尝试了类似的示例。我只是想了解它。您注意到
local\u variable\u set
local\u variable\u get
的使用发生在方法内部,而不是外部吗
b.local\u variable\u set(:a,2)
是一种冗长的说法
a=2
。使用这些方法可以让Ruby动态地执行代码,而不需要任何源代码。@theTinMan,是的,当然。但是,当我将这些示例中的方法添加到irb并尝试调用它之后,它导致了一个错误“NoMethodError:undefined method local_variable_get for 3:Fixnum”,因此我认为变量
b
有错误。然后我试图在方法之外使用变量进行操作,结果发现我做不到。