12

我有一个Pointer具有单个属性的类:contents,它指向类的一个对象MyObject

class MyObject
  def hello; "hello" end
end

class Pointer
  attr_reader :contents
  def initialize( cont ); @contents = cont end
  # perhaps define some more state
end

我希望我Pointer能够复制自己。我知道该#dup方法是默认定义的,而#clone方法应该被覆盖以便能够进行深层复制。但在这里,副本不必太深。所以,我遇到的第一个难题是,我是否应该重写#dup方法,因为我真的不想复制 my 的附加状态Pointer,只需创建一个指向同一个MyObject实例的新状态?或者我应该避免 overridine #dup,因为我不是“应该”并#clone用一种制作浅拷贝的方法覆盖?

我欢迎对上述内容发表评论,但假设我会选择覆盖#dup. 我可以这样做:

class Pointer
  def dup; self.class.new( contents ) end
end

但在网上,我读到类似“ dup方法将调用初始化复制方法”之类的内容。此外,这个人写了关于#initialize_clone,#initialize_dup#initialize_copyRuby 的文章。这让我想知道,最好的做法可能是这样的吗?

class Pointer
  def initialize_copy
    # do I don't know what
  end
end

还是像这样?

class Pointer
  def initialize_dup
    # do I don't know what
  end
end

还是我应该忘记为迷惑初学者而编写的在线咆哮而无忧无虑地去压倒一切#dup

另外,我知道我可以在#dup不定义任何 custom的情况下直接调用#dup,但是如果我想定义#dup不同的行为怎么办?

此外,同样的问题适用于#clone- 我应该尝试定义#initialize_clone还是只是#clone

4

1 回答 1

20

根据我的经验,重载#initialize_copy 工作得很好(从未听说过initialize_dup 和initialize_clone)。

原始的 initialize_copy(它用原始对象的值初始化每个实例变量)可以通过 super 获得,所以我通常这样做:

class MyClass
  def initialize_copy(orig)
    super
    # Do custom initialization for self
  end
end
于 2012-08-14T13:00:31.490 回答