Marshalでdeep copy

Object#dupshallow copyですけれど、Marshal.dumpとMarshal.loadでdeep copyになります。

a = ["A", ["B", "C"]]

# dup - shallow copy
b = a.dup
p a == b                              #=> true
p a.object_id == b.object_id          #=> false
p a[0].object_id == b[0].object_id    #=> true
p a[1].object_id == b[1].object_id    #=> true

# dump+load - deep copy
c = Marshal.load(Marshal.dump(a))
p a == c                              #=> true
p a.object_id == c.object_id          #=> false
p a[0].object_id == c[0].object_id    #=> false
p a[1].object_id == c[1].object_id    #=> false