2010-06-06 24 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 ] }