Ruby の dup と clone

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