12

classのオブジェクトを指すPointer単一の attribute を持つクラスがあります。:contentsMyObject

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の追加の状態を本当にコピーしたくないので、メソッドをオーバーライドする必要があるので、同じインスタンスPointerを指す新しい状態を作成するだけですか? または、「想定」されていないためMyObject、 overridine を控えて、浅いコピーを作成するメソッドでオーバーライドする必要がありますか?#dup#clone

上記のコメントを歓迎しますが、オーバーライドすることを選択するとしましょう#dup。私はこれを行うことができます:

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

しかし、オンラインで、「dupメソッドはinitialize copyメソッドを呼び出す」のようなものを読みました。また、この人はRuby#initialize_cloneで ,#initialize_dupとについて書いています。#initialize_copyベストプラクティスはおそらくこのようなものでしょうか?

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 に答える