为什么在二维数组中赋值会有不同的结果?

Why are there different results when assigning a value in a two-dimension array?

这两个作业有什么区别?为什么他们有不同的结果?

arr3 = Array.new(2, Array.new(2, 0))
arr4 = [[0, 0], [0, 0]]

arr3 == arr4  # => true
arr3 === arr4  # => true

arr3[0][0] = "/"
arr4[0][0] = "/"

arr3  # => [["/", 0], ["/", 0]]
arr4  # => [["/", 0], [0, 0]]

因为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)

...In the first form, if no arguments are sent, the new array will be empty. When a size and an optional default are sent, an array is created with size copies of default. Take notice that all elements will reference the same object default.

您使用上面的形式创建了 arr3,同时使用 文字构造函数创建了 arr4 [].

A new array can be created by using the literal constructor []. Arrays can contain different types of objects.

如果您希望 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]
>>

arr3中的两个元素共享相同的object_id,因此它们将一起更改。

代码:

arr3.each do |item|
  p item.object_id
end

arr4.each do |item|
  p item.object_id
end

但我仍然不知道为什么 Array.new 会发生这种情况。