【问题标题】:Original variable still changes with .clone or .dup原始变量仍随 .clone 或 .dup 变化
【发布时间】:2014-06-24 03:04:26
【问题描述】:

当我执行这个程序时,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"]
])  

【问题讨论】:

    标签: ruby


    【解决方案1】:

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

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

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

    如果您所在的领域通常需要集合副本,或者您正在尝试以更具功能性的风格工作,我建议您查看Hamster gem,它为 ruby​​ 带来了不可变的数据结构。

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2012-01-31
      • 2013-01-11
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多