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] 

那为什么呢?

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

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

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

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

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