RubyのObject.dup
とObject.clone
の違いは、特異メソッドとfreeze
をコピーするかどうかである。 Object.clone
の方がコピーされる情報が多いが、一般的な用途にはObject.dup
で十分だ。 以下は検証コード。
obj1 = Object.new
obj1.taint
def obj1.singleton_method; end
obj1.freeze
obj2 = obj1.dup
obj3 = obj1.clone
p obj1.tainted? #=> true
p obj1.respond_to?(:singleton_method) #=> true
p obj1.frozen? #=> true
p obj2.tainted? #=> true
p obj2.respond_to?(:singleton_method) #=> false
p obj2.frozen? #=> false
p obj3.tainted? #=> true
p obj3.respond_to?(:singleton_method) #=> true
p obj3.frozen? #=> true