Rubyでオブジェクトをコピーするメソッドには、Object#cloneとObject#dupの二種類があります。それぞれ少しだけ機能が違うようなのですが、参考書によって記述が異なっていて???となったので調べました。
参考書の記述
それぞれの該当部分を引用します
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は汚染フラグをコピーする」が正解なようです。