代码之家  ›  专栏  ›  技术社区  ›  Andrew Grimm atk

在Ruby中什么时候使用dup,什么时候使用clone?

  •  13
  • Andrew Grimm atk  · 技术社区  · 12 年前

    What's the difference between Ruby's dup and clone methods? 描述了 dup clone 。但是我什么时候用 杜普 ,以及何时使用 克隆 相反

    实际项目中的例子讨论了他们为什么使用dup而不是clone,反之亦然,这将是解决这个问题的理想方法。

    或者,解释为什么存在这两种不同的方法也会有所帮助。这可能是指Ruby创建者的语句,或者是对以下方法的检查 杜普 克隆 在影响Ruby的语言中。

    2 回复  |  直到 7 年前
        1
  •  8
  •   Patrick Oscity    10 年前

    的确 clone 复制 frozen 对象的状态,而 dup 不会:

    o = Object.new
    o.freeze
    
    o.clone.frozen?
    #=> true
    
    o.dup.frozen?
    #=> false
    

    克隆 还将复制对象的singleton方法,同时 杜普 不会:

    o = Object.new
    def o.foo
      42
    end
    
    o.clone.respond_to?(:foo)
    #=> true
    
    o.dup.respond_to?(:foo)
    #=> false
    

    这让我产生了这样的假设 克隆 有时被理解为提供比 杜普 。以下是关于该主题的一些引文:

    Comment on ActiveRecord::Base#initialize_dup from Rails 3 以下为:

    重复的对象没有分配id,将被视为新记录。笔记 这是一个“浅”副本,因为它复制了对象的属性 只是,而不是它的关联。“深度”复制的范围是应用程序 具体的,因此留给应用程序根据 根据其需要。

    An article about deep copies in Ruby 以下为:

    还有另一种方法值得一提, 克隆 这个 克隆 方法的作用与 杜普 有一个重要的区别:预计对象将用一个可以进行深度复制的方法覆盖此方法。

    But then again, theres deep_dup in Rails 4 以下为:

    如果对象是可复制的,则返回对象的深度副本。如果不可复制,则返回 self

    and also ActiveRecord::Core#dup and #clone in Rails 4 以下为:

    克隆 与Ruby的克隆方法相同。这是一个“肤浅”的复制品。请注意,您的属性不会被复制。[…]如果您需要属性哈希的副本,请使用 #dup 方法

    这意味着在这里,这个词 杜普 用于再次引用深度克隆。据我所见,除了你应该使用 克隆 杜普 在你需要任何一种特定副作用的情况下。

    终于,我明白了 杜普 在Ruby代码中比 克隆 .我从来没有用过 克隆 到目前为止,我不会,直到我明确需要。

        2
  •  5
  •   waldyr.ar    12 年前

    DUP&克隆可用于创建对象的浅层副本。两者都复制obj的实例变量。但在使用它们时我们需要有选择性。

    它们之间几乎没有什么区别

    1) CLONE复制对象的FROZEN和TAINTED状态,其中DUP仅复制对象的TAINTED。

    2) 使用CLONE,您可以复制对象的任何单例方法,但DUP不支持这样做。

    CLONE用于复制对象,包括其内部状态,DUP通常使用派生对象的类来创建新实例。

    在使用DUP复制ActiveRecord行时,我有过一些痛苦的经历,这最终导致丢失了原始行——CLONE也能很好地工作。

    当我把自己裹在困惑中时,我发现 Article of Open Source is Wide Open