Подтвердить что ты не робот

Использование строки в качестве переменной во время выполнения

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

4b9b3361

Ответ 1

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

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}")

Ответ 2

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

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.

Ответ 3

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

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

Вот docs.

Ответ 4

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

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

Ответ 5

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

instance_variable_set('@' + 'users', User.all)

Ответ 6

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

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