更新2D阵列中的数组

时间:2016-01-11 17:17:54

标签: arrays ruby

我创建了一个2D数组A

A = [A_0, A_1, ... A_n]

并将A_n附加到A,现在就成了:

A = [A_0, A_1, ... A_n, A_n]

然后我试图改变最后一个数组中的一个元素,期望得到:

A = [A_0, A_1, ... A_n, A_n'] # (the last array is changed)  

然而,我明白了:

A = [A_0, A_1, ... A_n', A_n'] # (two last arrays are changed)  

这就像两个A_n共享相同的索引。

示例代码:

arr = [[0], [0]]
arr << arr[1]    
p arr
arr[1][0] = 1
p arr

预期产出:

[[0], [0], [0]]  
[[0], [1], [0]]

实际输出:

[[0], [0], [0]]  
[[0], [1], [1]]  

为什么会这样,我该如何绕过它?

2 个答案:

答案 0 :(得分:2)

您所看到的问题是由于数组与索引2中的索引1中的对象相同。要查看此内容,请运行getRandomElement(),您可以通过复制正在推入的数组来绕过它:< / p>

arr.map(&:object_id)

答案 1 :(得分:1)

这可能会帮助您查看问题:

arr = [[0], [0]]
arr.map{ |o| o.object_id.to_s(16) } # => ["3fd87c4e2854", "3fd87c4e2840"]

这些是数组中两个元素的对象ID。

arr << arr[1]    
arr.map{ |o| o.object_id.to_s(16) } # => ["3fd87c4e2854", "3fd87c4e2840", "3fd87c4e2840"]

如果您将第二个元素追加回数组,那么您将获得它的副本,因此更改该元素将反映在它的两个引用中。

如果您追加一个空数组,那么您已经创建了一个新对象,由不同的object_id证明:

arr = [[0], [0]]
arr << []
arr.map{ |o| o.object_id.to_s(16) } # => ["3ff8110dfe28", "3ff8110dfe14", "3ff8110dfdec"]

元素的object_id值已更改,因为这是表达式的单独运行。重要的是现在这三个都有不同的ID。