📝
Ruby の #clone は特異メソッドまでコピーするが #dup は特異メソッドをコピーしない
知らなかたので覚書シリーズ。
#clone も #dup もそれぞれレシーバのオブジェクトをコピーする機能なんですが #clone はレシーバの特異メソッドをコピーし、 #dup はコピーしないという違いがあります。
obj = Object.new
# 特異メソッドを定義
def obj.hoge = "hoge"
# #clone の場合は特異メソッドごとコピーされる
obj_clone = obj.clone
p obj_clone.hoge # => "hoge"
# #dup の場合は特異メソッドはコピーされない
obj_dup = obj.dup
p obj_dup.hoge # => error: undefined method 'hoge' for an instance of Object (NoMethodError)
なんとなく違いがあるのは覚えてたけどこの違いは知らなかった。
Discussion