2015-04-12 85 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

相关问题