【问题标题】:Ruby: Changing the variable outside the methodRuby:在方法外更改变量
【发布时间】:2017-03-15 17:33:05
【问题描述】:

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

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

【问题讨论】:

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

标签: ruby binding eval


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2013-10-22
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多