What is it, naokirin?

Rubyのdup、cloneの動作の差異

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が外れてしまうというのも微妙なので動作としては良い気がしますが、リファレンスの書き方が微妙かもしれませんね。