がオブジェクトcloneの状態をコピーするのは事実ですが、そうではありません。frozendup
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_dupRails 3 からのコメント:
複製されたオブジェクトには ID が割り当てられておらず、新しいレコードとして扱われます。これはオブジェクトのアトリビュートのみをコピーし、関連付けはコピーしないため、「浅い」コピーであることに注意してください。「ディープ」コピーの範囲はアプリケーション固有であるため、アプリケーションの必要に応じて実装する必要があります。
Ruby のディープ コピーに関する記事:
言及する価値のある別の方法がありcloneます。このcloneメソッドは と同じことをdup行いますが、重要な違いが 1 つあります。オブジェクトは、ディープ コピーを実行できるメソッドでこのメソッドをオーバーライドすることが予想されます。
しかし、deep_dupRails 4 には次のようなものがあります。
複製可能なオブジェクトのディープ コピーを返します。複製できない場合は、 を返しますself。
またActiveRecord::Core#dup、#cloneRails 4 では:
clone— Ruby の clone メソッドと同じです。これは「浅い」コピーです。属性がコピーされないことに注意してください。[...] 属性ハッシュのコピーが必要な場合は、#dupメソッドを使用してください。
つまり、ここでもこの単語dupはディープ クローンを指すために使用されています。私が見る限り、いずれかの特定の副作用が必要な場合にcloneandを使用する必要があることを除いて、コミュニティにはコンセンサスがないようです。dup
最後に、私はdupRuby コードよりもはるかに頻繁に見かけますclone。私はcloneこれまで一度も使用したことがなく、明示的に必要になるまで使用しません。