阵列行为不端

时间:2011-10-07 19:53:00

标签: ruby arrays

以下是代码:

# a = Array.new(3, Array.new(3))
a = [[nil,nil,nil],[nil,nil,nil]]
a[0][0] = 1
a.each {|line| p line}

输出:

[1, nil, nil]
[nil, nil, nil]

但使用注释行:

[1, nil, nil]
[1, nil, nil]
[1, nil, nil]

那为什么呢?

1 个答案:

答案 0 :(得分:6)

注释行将三个相同的引用分配给数组,因此对一个数组的更改将传播到对其的其他引用。

对于2个数组vs 3,这只是第一行的问题,指定3作为其第一个参数,并且仅在第二行中指定2个数组文字。

要创建嵌套数组而不使用任何共享引用:

a = Array.new(3) {Array.new(3)}

当传递一个块({...}do ... end)时,Array.new将调用该块以获取该数组的每个元素的值。