如何在ruby中动态命名对象引用(句柄)

时间:2010-06-06 21:52:43

标签: ruby object reference

所以我有一个这样的课程:

def Word


end 

并通过像这样的数组循环

array.each do |value|

end

在该循环中,我想用var

的句柄实例化一个对象
value = Word.new

我确信有一种简单的方法可以做到这一点 - 我只是不知道它是什么!

谢谢!

2 个答案:

答案 0 :(得分:2)

要将内容分配给动态变量名称,您需要使用eval

之类的内容
array.each do |value|
  eval "#{value} = Word.new"
end

但是检查这是你想要的 - 你应该避免使用eval来解决真正需要不同数据结构的事情,因为很难调试用eval创建的错误,并且很容易导致不希望的行为。例如,您可能真正想要的是单词和关联对象的哈希,例如

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

不会使用大量Word个对象污染您的命名空间。

答案 1 :(得分:2)

根据您要使用的数据结构,您也可以这样做:

# 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 ] }