2013-06-16 7 views
2

Как использовать строки или символы для создания новых переменных || объекты? Скажем, я хочу 5 уникальных объектов уже сделанного класса предметов;Ruby: использование строк для динамического создания объектов

for x in 1..5 
    item_x = item.new() #where x is obviously the number value of the iterator 
end 

Я попытался с помощью Eval() таким образом:

for x in 1..5 
    eval("item_" << x << "= item.new()") 
end 

Надеясь, что ввод строки я хочу выполненный в Eval бы он выполнен, как если бы я положил его в код.

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

+2

Это метод PHP/Perl, который не поддерживается Ruby и обычно обескуражен, потому что его очень сложно поддерживать и отлаживать. «Эй, откуда появился« item_x »!? Это нигде в исходном коде !?" Я бы рекомендовал переосмыслить, как вы можете хранить данные в контейнере, например массив или хэш, и получать доступ к данным, как вам нужно. Вы можете объяснить цель, и мы можем помочь вам выбрать лучшие структуры, а не просить о помощи в том, что не является хорошим направлением. –

ответ

3

Есть ли причина, по которой вы не можете хранить объекты в массиве? Это сделало бы их легче и создавать и доступ:

items = [] 

5.times do 
    items << Item.new() 
end 

Тогда вместо item_1 через item_5, у вас есть item[0] через item[4].

Тем не менее, если вам действительно нужно/хотят делать тяжелую вещь, instance_variable_set вариант, если переменные экземпляра (с @) в порядке:

for x in 1..5 
    self.instance_variable_set("@item_#{x}", Item.new()) 
end 

Я бы рекомендовал просто придерживаться массива.

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

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

+0

В этом примере да. То, что я пытаюсь сделать, это создать объекты для радиоактивных изотопов по мере их возникновения, то есть как и другие изотопы впадают в них. У меня есть глобальный хеш, который имеет имена дочерних изотопов для каждого разлагающегося изотопа, и именно поэтому я хочу иметь возможность создавать объекты с помощью строк. Я мог бы создать много разных классов для каждого изотопа, но это очень непрактично. – user2489835

+0

@ user2489835 Это все еще не имеет смысла для меня. Я думаю, что Хэш имеет смысл. (См. Мое обновление.) –

+0

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

1

Вы можете использовать instance_variable_set для создания экземпляру переменных в порядке, вы изобразить:

for x in 1..5 
    variable_name = "item_#{x}" 
    instance_variable_set("@#{variable_name}", "value to assign to variable") 
end 

puts @item_1 #=> "value assigned to item_1" 

Заметим, однако, что это не создавать локальные переменные.

+0

Извините, но я не понял суть вопроса? – zeantsoi

Смежные вопросы