Rubyのdupとcloneでオブジェクトを複製する方法【初心者向け】
初心者向けにRubyのdupとcloneでオブジェクトを複製する方法について解説しています。オブジェクトのコピーに使われるdupとcloneについて、それぞれの違いと実際の書き方について学んでいきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
Ruby で Object をコピーする方法は複数個ありますが、その中で `dup` と `clone` を紹介します。
そもそもRubyについてよく分からないという方は、Rubyとは何なのか解説した記事を読むとさらに理解が深まります。
なお本記事は、TechAcademyのオンラインブートキャンプRuby講座の内容をもとに紹介しています。
今回は、Rubyに関する内容だね!
どういう内容でしょうか?
dupとcloneでオブジェクトを複製する方法について詳しく説明していくね!
お願いします!
dupとcloneの違い
様々な違いがありますが、実際にRubyでコードを書くために必要な知識として覚えておきたいのは2つの違いです。
- `clone` は特異メソッド、 `freeze` をコピーする
- `dup` は上記2つをコピーしない
それぞれどういったものか紹介します。
特異メソッドというのは、そのObjectしか使えないメソッドのことだ。定義の方法は以下のようにすると定義できます
rb
string = 'hoge' dummy = 'hoge' def string.piyo? false end string.piyo? #=> false dummy.piyo? #=> NoMethodError
この `piyo?` メソッドは上記コンテクストにおいての `string` Objectでしか利用することができません。
同じ `hoge` 文字列であっても、 `dummy` Objectにはそのようなメソッドが定義されていない、となります。
そして `freeze` はObjectの状態を凍結する目的で利用されます。
rb
class Klass attr_accessor :var end k = Klass.new k.var = 'hoge' puts k.var #=> 'hoge' k.freeze k.var = 'piyo' #=> FrozenError: can't modify frozen
このように、 `freeze` されたObjectはその内部状態を変更することができなくなります
さて、ようやくこれでもとの話に戻ると、つまり `clone` は上記のような情報もコピーし、 `dup` ではコピーしません
dupとcloneでオブジェクトを複製する方法
実際に複製する方法は行かようなコードとなります。
rb
cloned_object = object.clone duped_object = object.dup
Objectが持っているメソッドなので、他のメソッド同様に記述し、その返り値がコピーされたObjectとなります。
実際に書いてみよう
それでは実際に書いてみましょう。
rb
class Klass attr_accessor :var end k = Klass.new k.var = 'hoge' def k.piyp? self.var == 'piyo' end k.piyo? #=> false k.var = 'piyo' k.piyo? #=> true k.freeze cloned_k = k.clone duped_k = k.dup puts cloned_k.var #=> 'piyo' puts cloned_k.piyo? #=> true puts cloned_k.var = 'huga' #=> FrozenError: can't modify frozen pust duped_k #=> 'piyo' puts duped_k.piyo? #=> NoMethodError puts duped_k.var = 'huga' puts k.piyo? #=> true puts k.var = 'huga' #=> FrozenError: can't modify frozen
ではどのような場面でこれが利用できるかというと、もとのObjectの状態を変更せずに、新たなObjectとして同じものを利用したいときなどに活用できます。
特に `irb` などで様々な実験をしたいときなどに、 元のObjectはいじりたくないけどこのObjectを使ってちょっとした実験をしたいときですね。
活用できるシーンは少ないですが、機能として覚えておくといざというときの選択肢足り得る機能です。是非書いてみましょう。
監修してくれたメンター
大塚 颯斗
Ruby on Rails, PHP, Go を中心としたウェブアプリケーションエンジニアとして都内のウェブサービスを提供する企業に在籍。 家で飼っている猫が好きだが、何故かすぐに猫に攻撃されて嫌われているかもしれない、というのが悩み。 |
内容分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
TechAcademyでは、初心者でもRuby on Railsを使ったプログラミングを習得できるオンラインブートキャンプRuby講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。