以下是代码:
# 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]
那为什么呢?
答案 0 :(得分:6)
注释行将三个相同的引用分配给数组,因此对一个数组的更改将传播到对其的其他引用。
对于2个数组vs 3,这只是第一行的问题,指定3作为其第一个参数,并且仅在第二行中指定2个数组文字。
要创建嵌套数组而不使用任何共享引用:
a = Array.new(3) {Array.new(3)}
当传递一个块({...}
或do ... end
)时,Array.new将调用该块以获取该数组的每个元素的值。