RubyのObjectクラスに定義されている、dupとcloneという二つのオブジェクトのコピー用のメソッドの動作について確認してみます。
バージョンはRuby1.9.2です。
a = Object.new a.freeze # freeze a1 = a.clone a2 = a.dup puts a1.frozen? puts a2.frozen? b = Object.new b.taint # taint b1 = b.clone b2 = b.dup puts b1.tainted? puts b2.tainted? c = Object.new def c.func # 特異メソッド "c.func" end c1 = c.clone c2 = c.dup puts "\n\n" puts "c1's public method" puts c1.public_methods # publicメソッドを表示 puts "\n\n" puts "c2's public method" puts c2.public_methods # publicメソッドを表示
結果は
true false true true c1's public method func nil? === =~ … c2's public method nil? === =~ …
リファレンス(http://www.ruby-lang.org/ja/man/html/Object.html)的には「clone は freeze、taint、特異メソッドなどの情報も含めた完全な複製を、dup はオブジェクトの内容のみの複製を作ります。」と書いてあり、taintもdupでは外れる形のように読めるのですが、trueと出てますね。
どちらかというとdupでtaintが外れてしまうというのも微妙なので動作としては良い気がしますが、リファレンスの書き方が微妙かもしれませんね。