Ruby 2.3:无法复制数组。原始数组修改

时间:2016-05-03 04:13:39

标签: arrays ruby

我正在对阵列执行操作,而且我遇到了一些问题。我复制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"]]

1 个答案:

答案 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])

我没有看到你通过改变子阵列获得了什么(尽管可能还有一些你没有告诉我们的事情)。