执行此程序时,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"]
])
答案 0 :(得分:1)
Ruby中的dup
或clone
是浅克隆,这意味着只克隆外部对象,而不是其子对象。在您的情况下,这意味着复制了couples
数组,但不是每个单独的数组。
如果您希望它是深克隆,则需要手动为stdlib数组执行此操作:
new_couples = original_couples.map { |couple| couple.clone }
如果您所在的域通常需要集合副本,或者您尝试使用更具功能性的样式,我建议您查看Hamster
gem,它将不可变数据结构带入ruby