因为arr3 包含两个相同的对象,但arr4 包含两个不同的对象。
>> arr3 = Array.new(2, Array.new(2, 0))
=> [[0, 0], [0, 0]]
>> arr3.map { |ary| ary.object_id }
=> [73703490, 73703490]
>> arr4 = [[0, 0], [0, 0]]
=> [[0, 0], [0, 0]]
>> arr4.map { |ary| ary.object_id }
=> [73670930, 73670920]
>>
阅读new(size=0, default=nil)
...在第一种形式中,如果没有发送参数,则新数组将为空。当发送一个大小和一个可选的默认值时,会创建一个数组,其中包含默认值的大小副本。 注意所有元素都将引用同一个对象默认。
您使用上面的表单创建了arr3,同时使用文字构造函数[]创建了arr4。
using the literal constructor [] 可以创建一个新数组。数组可以包含不同类型的对象。
如果您希望 Array::new 表现为文字结构,请使用 new(size) {|index| block } 形式。
>> arr3 = Array.new(2){ Array.new(2, 0) }
=> [[0, 0], [0, 0]]
>> arr3.map { |ary| ary.object_id }
=> [73551460, 73551450]
>>