我创建了一个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]]
为什么会这样,我该如何绕过它?
答案 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。