From: Paul Smith Date: 2009-10-15T05:16:37+09:00 Subject: Re: deep cloning, how? On Wed, Oct 14, 2009 at 7:30 PM, Robert Klemme wrote: > On 14.10.2009 19:03, Caleb Clausen wrote: > >> The documentation of Object#dup seems to suggest that subclasses >> should not override dup, preferring to override clone instead. > > Where do you take that from?  In the docs referenced below I cannot find > anything like that.  The only indication I can see is that #dup uses > #initialize_copy and we should probably override that instead of #dup > itself. > >> I'm not >> sure why this should be or why overriding dup would be bad. But >> anyway, I would suggest this: >> >> def deep_clone >>  copy=clone >>  copy.name=@name.clone >>  copy >> end >> >> just so you can keep the existing semantics of clone as a shallow copy. >> >> I'm really not sure why there are 2 methods to create shallow copies >> in ruby and what all the differences are supposed to be. Other than >> not overriding dup(?), the only other difference between them that I >> can discover is that clone copies the metaclass of the object, whereas >> dup reverts the copy's metaclass to being just its class. I've been >> wondering about the difference between the 2 recently; I hope someone >> out there can provide some enlightenment on why there are 2 and what >> the differences are. > > There are more differences namely in the area of frozen and tainted state. > > http://www.ruby-doc.org/core/classes/Object.html#M000351 > http://www.ruby-doc.org/core/classes/Object.html#M000352 > Also IIRC dup does not copy singleton methods and clone does. -- Paul Smith http://www.nomadicfun.co.uk paul@pollyandpaul.co.uk