【Ruby】「dup」と「clone」の違いとは?

どうも、Rubyをやっているものです。

さて突然ですがRubyにおける「dup」と「clone」の違いってよくわからなくありませんか?

個人的には、どっちのメソッドもコピーするものだというのはなんとなくわかっていたのですが、違いをよく理解していませんでした。

そこで今回は「dup」と「clone」の違いについて簡単にまとめておきたいと思います。

【Ruby】「dup」と「clone」の違いについて

違いは2つだけ!

押さえておかないといけない違いは2つだけです。

「clone」は「freezeの情報」と「特異メソッドの情報」をコピーする。「dup」はコピーしない。

以上です。

freezeのコピー

以下の問題で__(1)__に入れるのは「dup」か「clone」のどちらが適切か考えてみてください。

コード
old_data = [1,2,3]
old_data.freeze

new_data = old_data.__(1)__
new_data << 4

p new_data #=>[1,2,3,4]
答え「dup」

この場合、new_data << 4という形で破壊的メソッドを使っており、それがp new_dataに反映されています。つまりold_dataのfreezeをコピーしていないことがわかります。ですので「dup」を入れるのが適切です。

もしcloneを入れてしまうとold_dataのfreezeまでコピーしてしまい、new_dataで<<のような破壊的メソッドを使うことができずにエラーが発生します。

特異メソッドのコピー

以下の問題で__(1)__に入れるのは「obj.dup」か「obj.clone」のどちらが適切か考えてみてください。

コード
obj = Object.new

def obj.hello
  puts "Hi!"
end

copy = __(1)__

copy.hello #=> Hi!
答え 「obj.clone」

まずobjに特異メソッドを定義しています。この特異メソッドをcopyがレシーバになった場合でも使えるようにコピーする方法は、cloneを使うことです。dupでは特異メソッドまでコピーできません。

またマーシャリングでも特異メソッドはコピーできませんので、注意してください。

まとめ

というわけで簡単に「dup」と「clone」の違いをまとめてみました。細かい違いはあるのですが、基本的には「clone」は「freezeの情報」と「特異メソッドの情報」をコピーする。「dup」はコピーしないです。では!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA