Ruby でプロトタイプベースの OOP っぽいのをやるとき、ちょっと疑問に思ったので。
dup でオブジェクトをコピーすると、特異メソッドはコピーされません。なのでこれではプロトタイプベースの OOP には向きません。
$ pry [1] pry(main)> a = Object.new => #<Object:0x000055900f87b7f8> [2] pry(main)> class << a [2] pry(main)* def hello [2] pry(main)* puts "Hello!" [2] pry(main)* end [2] pry(main)* end => :hello [3] pry(main)> a.hello Hello! => nil [4] pry(main)> b = a.dup => #<Object:0x000055900f987ef8> [5] pry(main)> b.hello NoMethodError: undefined method `hello' for #<Object:0x000055900f987ef8> from (pry):9:in `__pry__'
では、clone でコピーすると?
[6] pry(main)> c = a.clone => #<Object:0x000055900f9db3f0> [7] pry(main)> c.hello Hello! => nil
なるほど、こちらは可能なのですね。
※参考
https://docs.ruby-lang.org/ja/latest/class/Object.html#I_CLONE