У меня есть строка, которая была создана во время выполнения. Я хочу использовать эту строку в качестве переменной для хранения некоторых данных. Как преобразовать строку в имя переменной?
Использование строки в качестве переменной во время выполнения
Ответ 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, если вы позаботились использовать переменную экземпляра класса вместо локальной.
Локальные переменные обычно не восстанавливаются. Все, что связано с префиксом @или @@, легко извлекается.