Caleb Clausen wrote:
> On 10/14/09, Robert Klemme <shortcutter / googlemail.com> wrote:
>> 2009/10/14 Rajinder Yadav <devguy.ca / gmail.com>:
>>> I am trying to figure out how to perform a deep clone
>>>
>>>
>>> class A
>>>   attr_accessor :name
>>> end
>>>
>>> a1 = A.new
>>> a1.name = "yoyoma"
>>> a2 = a1.dup
>>> a1.name.chop!
>>> puts a2.name
>>>
>>>
>>> I found the following way to write a deep clone method
>>>
>>> class A
>>>  attr_accessor :name
>>>  def dup
>>>     Marshal::load(Marshal.dump(self))
>>>  end
>>> end
>>>
>>> If I wanted to write my own specialize deep_cloner, how would I do this.
>>> If
>>> I try the obvious way to do it,
>>>
>>> def dup
>>>   @name = self.name.dup
>>> end
>> No, this is by far not the obvious way since you would at least have
>> to make sure there is a copy of self and this is returned from dup.  I
>> would rather do
>>
>> def dup
>>   copy = super
>>   copy.name = @name.dup
>>   copy
>> end
>>
>> or even
>>
>> def dup
>>   self.class.new(@name.dup)
>> end
>>
>> Although that approach is fragile depending on the code in #initialize.
> 
> The documentation of Object#dup seems to suggest that subclasses
> should not override dup, preferring to override clone instead. 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
> 

cool, do a shallow clone and then do a specialized deep cloning, i like this! I 
did not get as far as you did about dup and clone and not to redefine dup, this 
is news to me but something worth looking into.

> 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.
> 
> 


-- 
Kind Regards,
Rajinder Yadav

http://DevMentor.org
Do Good ~ Share Freely