开发者

Ruby: Setting a global variable by name

开发者 https://www.devze.com 2023-02-19 18:46 出处:网络
I am trying to 开发者_开发百科dynamically set (not create, it already has to exist) a global ruby variable in a method. The variable name is determined from the passed symbol. What I am currently doin

I am trying to 开发者_开发百科dynamically set (not create, it already has to exist) a global ruby variable in a method. The variable name is determined from the passed symbol. What I am currently doing is the following:

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

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

But to me, this kind of feels very wrong. Is this the way to do this? Or can it be done differently? Also, I don't know how evals perform in ruby. Does it run much slower than

$foo_bar = 42


The method looks fine to me. This guy says that eval efficiency is much worse, though the post is 3 years old.

I will point out that this method suggests you have a lot of global variables, which is generally a code smell if the code base is significant.


If you can use an instance variable instead, there is Object#instance_variable_set.

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

Note that it only accepts variable names that can be accepted as an instance variable (starting with @). If you put anything else in the first argument, it will return an error. For the global variable counterpart to it, there is a discussion here: Forum: Ruby

Either way, you also have the problem of accessing the variable. How are you going to do that?

0

精彩评论

暂无评论...
验证码 换一张
取 消