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 > ¨Âôôòßáããåóóïò ºîáí> ¨Âåæ äõ> Marshal::load(Marshal.dump(self)) > ¨Âîä > 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. > I get an error when 'puts a2.name' is executed saying: > > NoMethodError: undefined method `name' for "yoyom":String > > > Can someone explain what's going on when dup is called. What gets passes to > dup (i assume self) and why my code is wrong? Hope the above sheds some light. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/