おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

オブジェクトのコピーについて

Rubyでオブジェクトをコピーするメソッドには、Object#cloneとObject#dupの二種類があります。それぞれ少しだけ機能が違うようなのですが、参考書によって記述が異なっていて???となったので調べました。

参考書の記述

それぞれの該当部分を引用します

プログラミング言語Ruby

Objectが定義するcloneとdupには、2つの重要な違いがある。まず、cloneは、オブジェクトのフリーズ、汚染状態(すぐ後で説明する)をともにコピーするのに対し、dupは汚染状態しかコピーしない。フリーズされたオブジェクトからdupを呼び出すと、フリーズされていないコピーが返される。第2に、cloneは、オブジェクトの特異メソッドをコピーするが、dupはコピーしない。

Rubyレシピブック

dupメソッドとcloneメソッドの違いは、dupメソッドが内容だけをコピーするのに対し、cloneメソッドは特異メソッドと汚染フラグ(taint?)、凍結情報(frozen?)までコピーすることです。

まとめると、両方の参考書ともにcloneは

までコピーすると書いてありますが、dupは汚染フラグをコピーする/しないで分かれていますね。

実際に試してみました

ちなみにRubyのバージョンは1.8.6です。

origin = "hoge"
origin.taint
origin.tainted? #=> true
copy = origin.dup
copy.tainted? #=> true

まとめ

というわけで、「dupは汚染フラグをコピーする」が正解なようです。