Ruby:按名称设置全局变量

时间:2011-03-26 18:08:42

标签: ruby global-variables eval

我正在尝试动态设置(不创建,它已经存在)方法中的全局ruby变量。变量名称由传递的符号确定。我目前正在做的是:

def baz(symbol)
  eval("$#{symbol}_bar = 42")
end

$foo_bar = 0
baz(:foo)
puts $foo_bar # => 42  

但对我来说,这种感觉非常错误。这是这样做的方法吗?或者可以采用不同的方式吗?另外,我不知道evy在evy中的表现如何。它的运行速度比

慢得多
$foo_bar = 42

2 个答案:

答案 0 :(得分:2)

这个方法对我来说很好看。这个guy表示,评估效率要差很多,尽管这个帖子已经有3年了。

我将指出这个方法表明你有很多全局变量,如果代码库很重要,这通常是代码味道。

答案 1 :(得分:1)

如果您可以使用实例变量,则有Object#instance_variable_set

  def baz(symbol)
    instance_variable_set("@#{symbol}_bar", 42)
  end

请注意,它只接受可以作为实例变量接受的变量名称(以@开头)。如果在第一个参数中放入其他内容,则会返回错误。对于它的全局变量,这里有一个讨论:Forum: Ruby

无论哪种方式,您还有访问变量的问题。你打算怎么做?