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

Ruby 为什么在二维数组中赋值时会有不同的结果?,ruby,arrays,Ruby,Arrays,这两个作业有什么区别?为什么会有不同的结果 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

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

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]
>>
阅读

…在第一种形式中,如果未发送任何参数,则新数组将为空。发送大小和可选默认值时,将使用默认值的大小副本创建一个数组。请注意,所有元素都将引用同一对象默认值

您使用上面的表单创建了
arr3
,而使用文本构造函数
[]
创建了
arr4

可以通过创建新数组。数组可以包含不同类型的对象

如果希望
Array::new
表现为文字构造,那么使用
new(size){| index | block}
form

>> arr3 = Array.new(2){ Array.new(2, 0) }
=> [[0, 0], [0, 0]]
>> arr3.map { |ary| ary.object_id }
=> [73551460, 73551450]
>>

arr3
中的两个元素共享相同的
object\u id
,因此它们将一起更改

代码:


但我仍然不知道为什么
数组。新的
让这一切发生。

@sawa我完成了。。欢迎您更正……)我建议你对@Arup的答案发表评论。我仍然不知道为什么
Array。new
让这一切发生。--你看过我提到的doco链接了吗?这不是评论。我用@Arup的答案回答了我自己。我刚把它贴出来就看到了。谢谢你的回答和文档链接。
arr3.each do |item|
  p item.object_id
end

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