2010-06-06 27 views
1

所以我有这样一个类:如何命名的对象引用(句柄)动态红宝石

def Word 


end 

和IM循环直通这样

array.each do |value| 

end 

一个数组,这个循环我里面要实例化一个对象,用var

value = Word.new 

我肯定有一个简单的方法来做到这一点的手柄 - 我只是不知道w ^它是帽子!

谢谢!

+0

我不太明白。你说你“想用一个var的句柄实例化一个对象”,但这对我来说并不意味着什么。如果你不能澄清这是什么意思,你至少能解释你​​期望它有什么作用? – Chuck 2010-06-06 21:57:27

+1

你使用class class创建一个类;结束'不'def词;结束' – horseyguy 2010-06-07 05:41:13

+0

是的,谢谢 - 这是刚刚成为红宝石,并有点脑炸的结果:) – RetroNoodle 2010-06-16 20:26:25

回答

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

绝对不要做第一个,除非你想引起自己很多额外的麻烦。 – Chuck 2010-06-06 21:58:20

+0

啊,谢谢彼得和查克。我没有想到这样做。是的,我坚持第二个 - 它看起来非常聪明,实际上可以让我做更多。 我只需要一种方法让我的每个“值”(它们都是变量)成为一个Word对象。值的散列不会工作,因为我需要的方法以及值。所以对象的散列 - brillant - 谢谢你们! – RetroNoodle 2010-06-06 22:03:27

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