📝

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)

なんとなく違いがあるのは覚えてたけどこの違いは知らなかった。

GitHubで編集を提案

Discussion