我正在尝试动态设置(不创建,它已经存在)方法中的全局ruby变量。变量名称由传递的符号确定。我目前正在做的是:
def baz(symbol)
eval("$#{symbol}_bar = 42")
end
$foo_bar = 0
baz(:foo)
puts $foo_bar # => 42
但对我来说,这种感觉非常错误。这是这样做的方法吗?或者可以采用不同的方式吗?另外,我不知道evy在evy中的表现如何。它的运行速度比
慢得多$foo_bar = 42
答案 0 :(得分:2)
这个方法对我来说很好看。这个guy表示,评估效率要差很多,尽管这个帖子已经有3年了。
我将指出这个方法表明你有很多全局变量,如果代码库很重要,这通常是代码味道。
答案 1 :(得分:1)
如果您可以使用实例变量,则有Object#instance_variable_set
。
def baz(symbol)
instance_variable_set("@#{symbol}_bar", 42)
end
请注意,它只接受可以作为实例变量接受的变量名称(以@
开头)。如果在第一个参数中放入其他内容,则会返回错误。对于它的全局变量,这里有一个讨论:Forum: Ruby
无论哪种方式,您还有访问变量的问题。你打算怎么做?