がオブジェクトclone
の状態をコピーするのは事実ですが、そうではありません。frozen
dup
o = Object.new
o.freeze
o.clone.frozen?
#=> true
o.dup.frozen?
#=> false
clone
オブジェクトのシングルトンメソッドもコピーしますが、コピーしdup
ません:
o = Object.new
def o.foo
42
end
o.clone.respond_to?(:foo)
#=> true
o.dup.respond_to?(:foo)
#=> false
clone
これは、 よりも「より深い」コピーを提供すると理解されることがあるという仮定に私を導きますdup
。このトピックに関するいくつかの引用を次に示します。
ActiveRecord::Base#initialize_dup
Rails 3 からのコメント:
複製されたオブジェクトには ID が割り当てられておらず、新しいレコードとして扱われます。これはオブジェクトのアトリビュートのみをコピーし、関連付けはコピーしないため、「浅い」コピーであることに注意してください。「ディープ」コピーの範囲はアプリケーション固有であるため、アプリケーションの必要に応じて実装する必要があります。
Ruby のディープ コピーに関する記事:
言及する価値のある別の方法がありclone
ます。このclone
メソッドは と同じことをdup
行いますが、重要な違いが 1 つあります。オブジェクトは、ディープ コピーを実行できるメソッドでこのメソッドをオーバーライドすることが予想されます。
しかし、deep_dup
Rails 4 には次のようなものがあります。
複製可能なオブジェクトのディープ コピーを返します。複製できない場合は、 を返しますself
。
またActiveRecord::Core#dup
、#clone
Rails 4 では:
clone
— Ruby の clone メソッドと同じです。これは「浅い」コピーです。属性がコピーされないことに注意してください。[...] 属性ハッシュのコピーが必要な場合は、#dup
メソッドを使用してください。
つまり、ここでもこの単語dup
はディープ クローンを指すために使用されています。私が見る限り、いずれかの特定の副作用が必要な場合にclone
andを使用する必要があることを除いて、コミュニティにはコンセンサスがないようです。dup
最後に、私はdup
Ruby コードよりもはるかに頻繁に見かけますclone
。私はclone
これまで一度も使用したことがなく、明示的に必要になるまで使用しません。