どうも、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]
この場合、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に特異メソッドを定義しています。この特異メソッドをcopyがレシーバになった場合でも使えるようにコピーする方法は、cloneを使うことです。dupでは特異メソッドまでコピーできません。
またマーシャリングでも特異メソッドはコピーできませんので、注意してください。
まとめ
というわけで簡単に「dup」と「clone」の違いをまとめてみました。細かい違いはあるのですが、基本的には「clone」は「freezeの情報」と「特異メソッドの情報」をコピーする。「dup」はコピーしないです。では!