2012-05-31 62 views
6

我在Ruby中有一個由5個空數組組成的數組。我試圖使用<<運算符將字符串推入第一個數組,但結果是該字符串被推入所有數組中。請幫我理解這一點。將字符串壓入數組中的數組會產生意外的結果

預期輸出是:

# => [["car"], [], [], [], []] 

而是我得到:

# => [["car"], ["car"], ["car"], ["car"], ["car"]] 

IRB轉儲:

1.9.3-p194 :001 > output = Array.new(5, []) 
=> [[], [], [], [], []] 
1.9.3-p194 :002 > output.inspect 
=> "[[], [], [], [], []]" 
1.9.3-p194 :003 > output[0].inspect 
=> "[]" 
1.9.3-p194 :004 > output[0] << "car" 
=> ["car"] 
1.9.3-p194 :005 > output.inspect 
=> "[[\"car\"], [\"car\"], [\"car\"], [\"car\"], [\"car\"]]" 
+0

的可能重複[爲什麼沒有按在Ruby工作中定義新哈希值的方式很簡單(它們都指向相同的o bject)](http://stackoverflow.com/questions/7540084/why-doesnt-terse-way-of-defining-new-hashes-in-ruby-work-they-all-refer-to-sam) –

+0

謝謝所有!這真的讓我感到難過。現在我學到了一個新方法:object_id –

+0

任何人都可以幫助我理解爲什麼會發生這種情況,所以我可以更好地理解Ruby? –

回答

6

他們都是同一個對象:

ree-1.8.7-2012.02 :001 > output = Array.new(5, []) 
=> [[], [], [], [], []] 
ree-1.8.7-2012.02 :002 > output[0] 
=> [] 
ree-1.8.7-2012.02 :003 > output[0].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :004 > output[1].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :005 > output[2].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :006 > output[3].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :007 > output[4].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :008 > 

試試這個:

ree-1.8.7-2012.02 :008 > output = [] 
=> [] 
ree-1.8.7-2012.02 :009 > 5.times{output << []} 
=> 5 
+0

謝謝佩德羅!對不起,我花了這麼長時間來標記你的答案。 –

5

它們都具有相同的對象ID,由佩德羅·多納西門託指出,如果陣列以這種方式初始化。你可以解決這個問題通過使用similar syntax來創建嵌套的數組:

irb(main):047:0> output = Array.new(5) {[]} 
=> [[], [], [], [], []] 
irb(main):048:0> output.each {|i| puts i.object_id} 
10941700 
10941680 
10941660 
10941640 
10941620 

所以你追加到output[0]將會按預期:

irb(main):049:0> output[0] << "cat" 
=> ["cat"] 
irb(main):050:0> output 
=> [["cat"], [], [], [], []] 
1

代碼

output = Array.new(5, []) 

試圖僅創建該對象的一個​​副本,

因此

ree-1.8.7-2012.02 :003 > output[0].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :004 > output[1].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :005 > output[2].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :006 > output[3].object_id 
=> 2219989240 
ree-1.8.7-2012.02 :007 > output[4].object_id 
=> 2219989240 

如果你想創建對象的多個副本,使用此

 output = Array.new(5) {[]} #=> [[], [], [], [], []] 

代碼

output.each {|i| puts i.object_id} 

會告訴你

1.9.3-p194 :005 > output.each {|i| puts i.object_id} 
13417360 
13417340 
13417320 
13417300 
13417280 
=> [[], [], [], [], []] 
相關問題