Ruby 原始变量仍随.clone或.dup更改

Ruby 原始变量仍随.clone或.dup更改,ruby,Ruby,当我执行这个程序时,原始的夫妇列表和新的夫妇列表总是相同的。我认为使用.clone或.dup应该是一种在不更改原始变量的情况下进行复制的方法。为什么会发生在这里 def swingers(couples) original_couples = couples new_couples = original_couples.clone swap_index1 = rand(3) swap_index2 = rand(3) new_couples[swa

当我执行这个程序时,原始的夫妇列表和新的夫妇列表总是相同的。我认为使用.clone或.dup应该是一种在不更改原始变量的情况下进行复制的方法。为什么会发生在这里

def swingers(couples)

    original_couples = couples

    new_couples = original_couples.clone

    swap_index1 = rand(3)
    swap_index2 = rand(3)

    new_couples[swap_index1][0], new_couples[swap_index2][0] = new_couples[swap_index2]    [0], new_couples[swap_index1][0] 

    puts original_couples
    puts new_couples
end
swingers([
  ["Clyde", "Bonnie"],
  ["Paris", "Helen"],
  ["Romeo", "Juliet"]
])  

Ruby中的
dup
clone
是浅层克隆,这意味着只克隆外部对象,而不克隆其子对象。在您的例子中,这意味着将复制
数组,但不会复制每个单独的对

如果希望它是深度克隆,则需要为stdlib阵列手动执行此操作:

new_couples = original_couples.map { |couple| couple.clone }
如果您所在的领域经常需要集合的副本,或者您正试图以更具功能性的方式工作,那么我建议您看看将不可变数据结构引入ruby的