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?