2015-04-12 39 views
0

最近我試圖在我的腳本中添加一個數字到其中一個嵌套數組。 我只希望指定索引處的嵌套數組具有附加的數字,但實際發生的是所有嵌套數組都附加了數字。爲什麼Array#將附加到嵌套數組中的所有數組而不僅僅是指定的索引?

這種行爲似乎很奇怪,爲什麼ruby數組以這種方式工作?

irb(main):001:0> [1,2,3].push 3 
=> [1, 2, 3, 3] 
irb(main):002:0> layered = [[]] * 5 
=> [[], [], [], [], []] 
irb(main):003:0> layered[0] << 2 
=> [2] 
irb(main):004:0> layered 
=> [[2], [2], [2], [2], [2]] 
irb(main):005:0> 

回答

4

因爲它們都是同一個數組。你可以通過調用每個元素Object#object_id檢查:

[3] pry(main)> layered = [[]] * 5 
=> [[], [], [], [], []] 
[4] pry(main)> layered[0].object_id 
=> 70207042910540 
[5] pry(main)> layered[1].object_id 
=> 70207042910540 
[6] pry(main)> layered[2].object_id 
=> 70207042910540 

要創建新陣列的每個元素,然後使用Array.new(5) { [] }

+0

非常感謝你!這似乎有點令人困惑,爲什麼'[[]] * 5'會這樣做。你知道什麼時候使用'[[]] * 5'的實際例子是合適的嗎? – Nirma

+0

當您將在賦值時替換整個數組(就像您應該這樣做)。所以如果你用'layered [0] + = [2]'代替'layered [0] << 2',那麼它應該可以工作。 – Hauleth

相關問題