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将调用该块以获取该数组的每个元素的值。