Как определить динамическую переменную и присвоить ей какое-то значение в рельсах

Я хочу создать динамические variable и присвоить им значения. Вот краткий пример того, что я пробовал до сих пор.

array = %w(this is a test)
array.each_with_index do |c,v|
  puts "variable_#{v}".to_sym
end

который дает мне вывод следующим образом:

# variable_0
# variable_1
# variable_2
# variable_3

Но когда я пытаюсь присвоить значение, как показано ниже:

array.each_with_index do |c,v|
  puts "variable_#{v}".to_sym = 45 # I want to assign value which will be result of api, here I just pass 45 static
end

это дает мне ошибку:

неопределенный метод `to_sym=' для "variable_0":String (NoMethodError)

Если я удалил .to_sym, это дает мне ошибку, например:

синтаксическая ошибка, неожиданное '='

Помогите пожалуйста мне. Как я могу этого добиться? Заранее спасибо.

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


person Hetal Khunti    schedule 18.05.2015    source источник
comment
Рассматривали ли вы использование Hash? Вы можете иметь хэш экземпляра и присвоить ему любое значение, которое вам нравится, с динамическими именами ключей.   -  person pedros    schedule 18.05.2015
comment
Я хотел зациклить эту переменную, поэтому я думаю, могу ли я сделать это с помощью хеш-ключа?   -  person Hetal Khunti    schedule 18.05.2015
comment
Вы не можете сделать это без инициализации этой переменной вне этого блока. Потому что иначе он не будет доступен за пределами этого блока. Вы должны использовать перечислитель для сохранения списка результатов.   -  person Anuja    schedule 18.05.2015
comment
@Anuja: Можете ли вы показать какой-нибудь пример? Я ценю   -  person Hetal Khunti    schedule 18.05.2015
comment
возможный дубликат динамически устанавливаемых локальных переменных в Ruby   -  person Lukas Baliak    schedule 18.05.2015
comment
Кажется, ваш код устанавливает локальные переменные (например, foo), но в вашей заметке говорится, что вы хотите установить переменную экземпляра (например, @foo). Я не уверен, что ты хочешь сделать.   -  person Wayne Conrad    schedule 19.05.2015


Ответы (2)


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

array.each_with_index do |c,v|
  instance_variable_set "@variable_#{v}".to_sym, 45 # `@` indicates instance variable
end
person RAJ    schedule 18.05.2015
comment
'неопределенный метод `to_sym=' для @variable_0:String (NoMethodError)' - person Hetal Khunti; 18.05.2015
comment
Спасибо за ваше решение, но потом я понял, что оно станет более сложным, поэтому я планирую создать новую функцию и передать динамическое имя переменной.. в любом случае, спасибо - person Hetal Khunti; 18.05.2015

Вы можете собрать результат в массив или хэш. Трудно привести пример с частичной информацией. Но в массиве вы можете собрать результат следующим образом:

result_set = array.collect do |c|
  45
end

Что даст вам

result_set = ["this", "is", "a", "test"]

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

person Anuja    schedule 18.05.2015
comment
Спасибо за ваше решение, но потом я понял, что оно станет более сложным, поэтому я планирую создать новую функцию и передать динамическое имя переменной.. в любом случае, спасибо - person Hetal Khunti; 18.05.2015
comment
Добро пожаловать. Но я не получил фактического требования. Я надеюсь, что вы получили решение для вашей проблемы. - person Anuja; 18.05.2015