classのオブジェクトを指すPointer
単一の attribute を持つクラスがあります。: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
の追加の状態を本当にコピーしたくないので、メソッドをオーバーライドする必要があるので、同じインスタンス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
?