原始变量仍然随.clone或.dup而变化

时间:2014-06-24 03:04:27

标签: ruby

执行此程序时,original_couples列表和new_couples列表始终相同。我认为使用.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"]
])  

1 个答案:

答案 0 :(得分:1)

Ruby中的dupclone克隆,这意味着只克隆外部对象,而不是其子对象。在您的情况下,这意味着复制了couples数组,但不是每个单独的数组。

如果您希望它是克隆,则需要手动为stdlib数组执行此操作:

new_couples = original_couples.map { |couple| couple.clone }

如果您所在的域通常需要集合副本,或者您尝试使用更具功能性的样式,我建议您查看Hamster gem,它将不可变数据结构带入ruby