侍テック編集部2018/10/172018/10/17こんにちは!エンジニアのタナカゴダイです。rubyのオブジェクトをコピーして、コピー先のオブジェクトの中身を変更したとき、「コピー元のオブジェクトの中身も変わってしまった...」というような経験はありませんか?そのような問題を解決する方法として、オブジェクトのコピーを作成するdupメソッドがあります。【発展】dupメソッドの類似メソッドであるcloneメソッドとは?【発展】dupメソッドとcloneメソッドの違いなどのdupメソッドに関連する基本から応用的な内容についても解説していきます。まとめdupメソッドとはdupメソッドとは、オブジェクトのコピーを作成するメソッドです。dupメソッドはオブジェクトのインスタンス変数をコピーした後に、Objectクラスのinitialize_copyメソッドを呼び出します。Objectクラスが持つインスタンスメソッドなので、オブジェクトに続けてメソッドを使用することができます。dupメソッドの基本的な書き方を以下に記載します。"c"]上記サンプルプログラムでは、original_objectの内容をdupメソッドでcopied_objectにコピーを作成しています。出力結果を確認すると、original_objectの値がcopied_objectにコピーされていることがわかります。dupメソッドの基本的な使い方ここでは、dupメソッドは「どのようにオブジェクトをコピーしているか」を、サンプルプログラムを用いて詳しく解説していきます。初めに結論から述べると、dupメソッドはオブジェクトの参照値をコピーして新しくオブジェクトを作成しています。dupメソッドを使用してオブジェクトをコピーすると、オブジェクトが持つidが新しく生成されるのです。この挙動はdupメソッドを使用した場合と、=を使用した場合のobject_idの変化を確認しながら理解するといいでしょう。{:c=>3}]を代入し、そのaをbに代入、さらにbをdupメソッドでコピーしています。cそれぞれのobject_idを1で確認します。cそれぞれの値の確認を2で行っています。上記サンプルプログラムの出力結果は以下の通りです。cの値1の結果では、aのobject_idとbのobject_idが等しくなっています。=を使用した場合は、bにaというオブジェクトを代入する、という挙動になるためaとbのobject_idが等しくなります。対して、cのobject_idはdupメソッドを使用したことにより、新しいobject_idになっていることがわかります。object_idが異なるということは2の結果に影響を与えます。cそれぞれの値を出力していますが、1で分かった通りaとbは同じオブジェクトを参照しているため、b[0]の値を変更するとaの出力結果も変わってきます。bと異なるオブジェクトを参照しているため、b[0]の値を変更してもcの値の出力結果には影響が出ないというわけです。このようにして、dupメソッドは値をコピーして新たにオブジェクトを作成するメソッドなのです。dupメソッドとcloneメソッドの違いとはdupメソッドに類似しているメソッドとして、cloneメソッドがあります。cloneメソッドとは、dupメソッドと同様にオブジェクトをコピーして作成するメソッドです。書き方はdupメソッドと変わりなく、オブジェクトに続けてcloneメソッドを使用します。"c"]では、dupメソッドとcloneメソッドでは何が違うのでしょうか。どちらもオブジェクトをコピーするメソッドですが、以下の点において、2つのメソッドに差異が生じます。・dupメソッドは汚染状態/信頼状態をコピーし、凍結状態/特異メソッドはコピーしない以下の表で、dupメソッドとcloneメソッドの差異についてまとめました。オブジェクトが変更可能かどうかを示す状態のことです。Objectクラスがもつfreezeメソッドで凍結状態に変更し、frozen?メソッドで凍結状態かどうかを確認することができます。dupメソッドとcloneメソッドを使用した際のオブジェクトの凍結状態について、実際のサンプルプログラムで確認しましょう。オブジェクトが汚染されているかどうかを示す状態のことです。Objectクラスがもつtaintメソッドで汚染状態に変更し、untaintメソッドで汚染状態を解除できます。tainted?メソッドで汚染状態かどうかを確認することができます。dupメソッドとcloneメソッドを使用した際のオブジェクトの汚染状態について、実際のサンプルプログラムで確認しましょう。オブジェクトが信頼されているかどうかを示す状態のことです。Objectクラスがもつtrustメソッドで信頼状態に変更し、untrustメソッドで信頼されていない状態に変更します。untrusted?メソッドで信頼状態かどうかを確認することができます。dupメソッドとcloneメソッドを使用した際のオブジェクトの信頼状態について、実際のサンプルプログラムで確認しましょう。cloneの信頼状態を確認(3-3)truetruetrue出力結果より、dupメソッドとcloneメソッドはどちらも信頼状態をコピーすることがわかります。特異メソッド最後に特異メソッドについて確認します。特異メソッドとは、簡潔に説明すると対象のオブジェクトが固有で持つメソッドのことです。以下は、aというオブジェクトにsingular_methodという特異メソッドを定義し、この特異メソッドsingular_methodが、dupメソッドとcloneメソッドでコピーされるか否かを確認するサンプルプログラムです。(4-6)出力結果より、dupメソッドはNoMethodErrorが出ているため特異メソッドsingular_methodまではコピーしていないことがわかり、cloneメソッドは特異メソッドsingular_methodまでコピーしていることがわかります。まとめこの記事では、dupメソッドの使い方をサンプルプログラムを用いて解説しました。dupメソッドは、オブジェクトのコピーを作成するメソッドです。dupメソッド以外のオブジェクトのコピーを作成するcloneメソッドについても違いとともに解説しました。この機会にdupメソッド/cloneメソッドをマスターしてください!TweetPocket無料でSEからWebエンジニアへ転職しませんか?侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、システムエンジニアという職業だけどコードが書けない事務作業が多くスキルがないため将来が不安スクールに通うと完全未経験者と同じスタートになるからレベルが合わないという、すでに知識があるSEならではのお悩みがあることに気づきました。弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。こちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。