Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyでの複製とクローン:違いを理解する

Rubyでオブジェクトをコピーできることをご存知ですか?それだけでなく、これを行うには2つの異なる方法があります!

これらの方法は

  • dup
  • clone

すぐに違いを探りますが、最初に…

なぜオブジェクトのクローンを作成するのですか? ?

Rubyの多くのオブジェクトは変更可能であり、変更することができます。

オブジェクトを変更したいが、元のコピーを保持する場合 その後、クローンを作成できます。

たとえば。

最初の要素を除くすべての要素を含む配列が必要な場合があります。

これを行う1つの方法

a = [1,2,3,4,5]

a[1..-1]
# [2,3,4,5]

別の方法は

b = a.clone

b.shift
# [1]

b
# [2,3,4,5]

どちらの例でも、元のアレイを保持できます。

Rubyでの複製とクローン:違いを理解する

冷凍オブジェクト

Dupとcloneは、他のRubyメソッド(map / collect)で発生するような相互のエイリアスではなく、いくつかの小さな違いがあります。

同一性と相違点を探る 2つのことの間は理解を深めるのに最適な方法です

どちらのメソッドもオブジェクトをコピーしますが、違いはdup オブジェクトの属性はコピーされません。

どのオブジェクト属性ですか?

  • 凍結状態
  • 汚染されたステータス
  • シングルトンクラス

ここに例があります

a = Object.new.freeze

b = a.dup
b.frozen?
# false

b = a.clone
b.frozen?
# true

Ruby 2.4には、cloneのオプションが含まれています 複製されたオブジェクトのフリーズ状態を無視します。

a.clone(freeze: true)
a.clone(freeze: false)

深いコピーと浅いコピー

オブジェクトをコピーすることには、目に見える以上のものがあります。

コピーを作成するときは、dupのいずれかを使用します またはclone浅いコピーを作成しています

これは、他のオブジェクトに含まれているオブジェクトがコピーされないことを意味します。

言い換えれば

文字列の配列がある場合は、文字列自体ではなく、配列のみがコピーされます。

自分の目で確かめてください:

original = %w(apple orange banana)
copy     = original.clone

original.map(&:object_id)
# [23506500, 23506488, 23506476]

copy.map(&:object_id)
# [23506500, 23506488, 23506476]

配列のクローンを作成した後でもオブジェクトIDは同じであるため、同じ文字列が使用されます。

あなたはこれでそれを解決することができます:

strings.clone.map(&:clone)

これにより、配列と文字列の両方が複製されますが、これは1レベルの深さしかないことに注意してください。別の方法として、ActiveSupportのdeep_dupメソッドを試すことができます。

概要

Rubyでオブジェクトのクローンを作成する方法を学びました。 dupとcloneの方法の違い、および浅いコピーと深いコピーの違いを含みます。

読んでくれてありがとう!


  1. プット、プリント、Pの違いを理解する

    Rubyで何かを印刷する方法はたくさんあります。 これが最も便利です : プット 印刷 p しかし、これらはどのように異なりますか? そしていつどちらを使うべきか ? それがこの記事で学ぶことです! 改行なしで印刷する方法 ユーザーが見られるように画面に何かを印刷する場合は、通常、putsを使用します 。 このように : puts Hello there! Putsは、メッセージを使用するたびに、メッセージの最後に新しい行を自動的に追加します。 改行が必要ない場合は、printを使用してください 。 例 : print 123 次回printするとき 最後の

  2. Rubyのデコレータデザインパターン

    デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli