だから私はルビーのバックグラウンドなしでクリスタルを学んでいて、APIドキュメントが基本的に配列をコピーしていることに気づきまし#dup
た#clone
。
2つの違いは正確には何ですか?APIは#dup
、浅いコピーが配列をコピーし、#clone
深いコピーがその配列をコピーすると言います。それが正確に何を意味し、どれを使用すべきかわかりません。
だから私はルビーのバックグラウンドなしでクリスタルを学んでいて、APIドキュメントが基本的に配列をコピーしていることに気づきまし#dup
た#clone
。
2つの違いは正確には何ですか?APIは#dup
、浅いコピーが配列をコピーし、#clone
深いコピーがその配列をコピーすると言います。それが正確に何を意味し、どれを使用すべきかわかりません。
#dup
メモリ内の配列、つまり含まれるアイテムのリストを複製しますが、アイテム自体は複製しません。新しい配列を変更しても以前の配列 ( push
、 などpop
) には影響しませんが、その項目のいずれかを変更すると、以前の配列の項目は同じオブジェクトであるため影響を受けます。
#clone
#clone
再帰的に呼び出すことにより、メモリ内の配列リストだけでなく、そのアイテムも複製します。これは、元のアレイの完全なクローンです。深くネストされたオブジェクトであっても、何かを変更しても、元のコンテンツには影響しません。
これは、配列だけでなく、すべてのオブジェクトに適用され、独自のオブジェクトのメソッドをオーバーライドすることで動作をカスタマイズできることに注意してください。
つまり、オブジェクトの配列 (クラス インスタンスなど) にのみ適用されます。プリミティブの配列 (integer、float、struct...) の場合、項目は によって配列リストとともにコピーされ#dup
ます。