我正在对阵列执行操作,而且我遇到了一些问题。我复制array_1
将其分配给array_2
。当我在array_2上执行操作时,uniq
方法会修改原始数组。
array_3
是我打算完成的,但我不明白为什么要修改array_1
的操作
我需要解释为什么会出现这种情况,以及如何防止这种情况发生。
array_1 = [["Ed","2",],["Ann","2"],["Sue","2"],["Ed","3",],["Ann","3"],["Sue","3"]]
array_2 = array_1.dup
array_2 = array_2.uniq(&:first)
array_3=[]
array_2.each do |a2|
a2.pop
array_3.push(a2)
end
puts array_3
=> [["Ed"], ["Ann"], ["Sue"]]
puts array_1
=> [["Ed"], ["Ann"], ["Sue"], ["Ed", "3"], ["Ann", "3"], ["Sue", "3"]]
答案 0 :(得分:3)
问题在于这一行:
array_2 = array_1.dup
来自文档:
<强> DUP 强>
生成obj的浅表副本 - 复制obj的实例变量,但不复制它们引用的对象。
所以array_2
包含指向array_1
中相同子阵列的指针。现在pop
改变了它的数组。因此,当您pop
中的array_2
个子数组时,它会影响array_1
中的相同子数组。
如果你说
,你会得到你似乎期望的结果array_2 = array_1.map(&:dup)
就个人而言,我会改变
a2.pop
array_3.push(a2)
到
array_3.push(a2[0])
我没有看到你通过改变子阵列获得了什么(尽管可能还有一些你没有告诉我们的事情)。