как динамически называть объектную ссылку (дескриптор) в ruby - PullRequest
1 голос
/ 07 июня 2010

Итак, у меня есть такой класс:

def Word


end 

и я зацикливаюсь на массиве, подобном этому

array.each do |value|

end

И внутри этого цикла я хочу создать экземпляр объекта с помощью дескриптора переменной

value = Word.new

Я уверен, что есть простой способ сделать это - я просто не знаю, что это такое!

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

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

# will give you an array:
words = array.map { |value| Word.new(value) }

# will give you a hash (as in Peter's example)
words = array.inject({}) { |hash, value| hash.merge value => Word.new }

# same as above, but more efficient, using monkey-lib (gem install monkey-lib)
words = array.construct_hash { |value| [value, Word.new ] }
2 голосов
/ 07 июня 2010

Чтобы присвоить вещи динамическому имени переменной, вам нужно использовать что-то вроде eval:

array.each do |value|
  eval "#{value} = Word.new"
end

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

words = {}    
array.each do |value|
  words[value] = Word.new
end

, который не будет загрязнять ваше пространство имен тоннами Word объектов.

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