Ruby: установка глобальной переменной по имени - PullRequest
4 голосов
/ 26 марта 2011

Я пытаюсь динамически установить (не создавать, он уже должен существовать) глобальную переменную ruby ​​в методе. Имя переменной определяется по переданному символу. Что я сейчас делаю, так это:

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

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

Но мне кажется, что это очень неправильно. Это способ сделать это? Или это можно сделать по другому? Кроме того, я не знаю, как улов действует в рубине. Работает ли он намного медленнее, чем

$foo_bar = 42

Ответы [ 2 ]

2 голосов
/ 26 марта 2011

Метод выглядит хорошо для меня. Этот парень говорит, что эффективность eval намного хуже, хотя посту 3 года.

Я укажу, что этот метод предполагает, что у вас есть много глобальных переменных, которые обычно являются запахом кода, если база кода значительна.

1 голос
/ 27 марта 2011

Если вместо этого вы можете использовать переменную экземпляра, существует Object#instance_variable_set.

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

Обратите внимание, что он принимает только те имена переменных, которые могут быть приняты в качестве переменной экземпляра (начиная с @).Если вы введете что-либо еще в первый аргумент, он вернет ошибку.Для аналога глобальной переменной здесь есть обсуждение: Форум: Ruby

В любом случае, у вас также есть проблема доступа к переменной.Как ты собираешься это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...