Object#cloneとObject#dupの違い

tl;dr

Effective Rubyを読んでいてObject#cloneObject#dupの違いを理解していなかったため確認しました。

Object#cloneObject#dupの違い

Object#cloneObject#dupの違いは、次の通りです。

  • Object#cloneはfreeze情報を複製するが、Object#dupは複製しない。
  • Object#cloneは特異メソッドを複製するが、Object#dupは複製しない。

サンプルコードで確認

実際にサンプルコードを書いて確認したいと思います。

freeze情報の複製

Object#cloneはfreeze情報を複製するが、Object#dupは複製しないことを確認しようと思います。

class Bank; end

bank = Bank.new
bank.freeze

puts bank.clone.frozen? # true
puts bank.dup.frozen? # false

特異メソッドの複製

Object#cloneは特異メソッドを複製するが、Object#dupは複製しないことを確認しようと思います。

class Bank; end

bank = Bank.new

def bank.set_rate
end

puts bank.clone.respond_to?(:set_rate) # true
puts bank.dup.respond_to?(:set_rate) # false