Использование строки в качестве переменной во время выполнения - PullRequest
36 голосов
/ 19 мая 2009

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

Ответы [ 6 ]

54 голосов
/ 19 мая 2009

Если вы можете простить знак @ перед именем переменной, будет работать следующее:

variable_name = ... # determine user-given variable name
instance_variable_set("@#{variable_name}", :something)

Это создаст переменную с именем @whatever, значение которой будет установлено на :something. :something, очевидно, может быть чем угодно. Кажется, это работает в глобальном масштабе, объявляя спонтанный экземпляр Object, который связывает все (я не могу найти ссылку на это).

Метод instance_variable_get позволит вам получить значение по имени аналогичным образом.

instance_variable_get("@#{variable_name}")
12 голосов
/ 19 мая 2009

Вместо того, чтобы делать это напрямую, почему бы не использовать вместо этого хеш. Строка будет ключом, а значение, которое вы хотите сохранить, будет значением. Примерно так:

string_values = { }
some_string = params[:some_string]       # parameter was, say "Hello"
string_values[some_string] = 42
string_values                            # { 'Hello' => 42 }
some_number = string_values[some_string]
some_number                              # 42

Это имеет несколько преимуществ. Во-первых, это означает, что вы не делаете ничего волшебного, что может быть трудно понять позже. Во-вторых, вы используете очень распространенную идиому Ruby, которая используется для аналогичной функциональности в Rails.

8 голосов
/ 19 мая 2009

Вы можете использовать eval() для этого при условии, что вы сначала объявили переменную:

>> foo = []
>> eval("foo")[1] = "bar"
>> foo[1]
=> "bar"

Вот документы .

5 голосов
/ 19 мая 2009

Я не хочу быть отрицательным, но действуйте осторожно. Ruby предоставляет вам множество функций для высокодинамичного программирования, таких как define_method, сохранение блоков в виде объектов Proc для последующего вызова и т. Д. Обычно это более чистый код и гораздо более безопасный. 99% времени с использованием eval() является ошибкой.

И абсолютно никогда не используйте eval() в строке, содержащей введенные пользователем данные.

3 голосов
/ 28 февраля 2014

Теперь, просто используя метод instance_variable_set, вы можете создать переменную экземпляра во время выполнения.

instance_variable_set('@' + 'users', User.all)
0 голосов
/ 19 мая 2009

Как говорит Джейсон Уоткинс, многие люди могут быстро использовать eval (), и это будет серьезной ошибкой. Большую часть времени вы можете использовать методику, описанную Tack, если вы позаботились об использовании переменной экземпляра класса вместо локальной.

Локальные переменные, как правило, не могут быть извлечены. Все, что с префиксом @ или @@, легко восстанавливается.

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