Michael Artz a écrit : > Robert Klemme wrote: > >> On 05.06.2007 16:45, Michael Artz wrote: >> >>> I'm needing to implement a deep copy operation on a couple of objects, >>> and was wondering if there was a "best practices" for this sort of >>> thing. I've seen the Marshal.load(Marshal.dump()) idiom, but I'm using >>> singleton classes which can't be dumped. >>> >> It seems they can be dumped - but you get another instance: >> > > hmm, my classes are structured as: > > class A > class B > class C > end > end > end > > ... and ... > > c = A::B::C.new > Marshal.dump(c) > > ... seems to work just fine, so I'm not quite sure what is going on with > my code, as I still get a "TypeError: singleton can't be dumped" from > Marshal.dump. I'll have to play around with it a bit more. > > >> You can use #instance_variable_get and #instance_variable_set to access >> them. >> > > Sweet, thanks! > > >> Did you consider overriding #dup and / or #clone for this? Typically >> you would not want a cloned / duped instance to refer to the original >> instance's instance variables (at least if they are mutable like >> collections, strings and other objects). >> > > Yeah, but I can't seem to wrap my head around the recursive cloning. > For example, in the above scenarion (A::B::C), how do I allocate space > for the new object without calling clone/dup? I.e, I'm sure that you > realize the problem with the following: > > class A > class B > class C > def clone > other = self.clone > end > end > end > end > > So how do I get the "other" object within the clone method? Do I need > to allow my initialize method to take in an object of the same type and > perform all the work of the clone method, or is there a better way? > > Thanks > -Mike > > Hi, To clone an object, you should define the #initialize_copy method in your class. This method takes the object to copy from, in argument. It is used by #clone and #dup to perform the initialization of the cloned object.