From: Michael Artz Date: 2007-06-06T00:29:27+09:00 Subject: Re: Deep Copy 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 -- Posted via http://www.ruby-forum.com/.