On Sat, 11 Dec 2004 19:42:23 +0900
"Robert Klemme" <bob.news / gmx.net> wrote:

> 
> "Brian Schröäer" <ruby / brian-schroeder.de> schrieb im Newsbeitrag 
> news:20041211105957.76dae75d / black.wg...
> > On Sat, 11 Dec 2004 09:22:24 +0900
> > Tim Hunter <cyclists / nc.rr.com> wrote:
> >
> >> Brian Schröäer wrote:
> >>
> >> > Interesting. But this won't work for instance variables that point to
> >> > arrays of deep_copy-able objects. Right?
> >>
> >> I knew you'd spot that :-) In a couple of cases I had to replace Arrays 
> >> with
> >> something like this:
> >>
> >>         class Content < Array
> >>             def deep_copy
> >>                 copy = self.class.new
> >>                 each do |c|
> >>                     copy << case
> >>                         when c.nil?
> >>                             nil
> >>                         when c.respond_to?(:deep_copy)
> >>                             c.deep_copy
> >>                         when c.respond_to?(:dup)
> >>                             c.dup
> >>                         else
> >>                             c
> >>                         end
> >>                 end
> >>                 return copy
> >>             end
> >>         end
> >>
> >> And, yes, I have to be careful not to use methods that return Array 
> >> objects.
> >>
> >
> > Maybe it would make sense to extend the base classes Object, Array, Hash 
> > with a
> > deep-copy functionality. That would be something for the extensions 
> > project.
> 
> IMHO not.  Reason beeing that the semantics of deep copy are class 
> dependend.  You might not want to copy all instances in an object graph for 
> deep copy and that might totally depend on the class at hand and / or (even 
> worse) application.  IMHO there is no real general solution to thid.  Of 
> course you could define a method in Object like
> 
> def deep_copy
>   Marshal.load( Marshal.dump( self ) )
> end
> 
> but you don't gain much that way.  And it won't even work in the general 
> case (consider Singletons etc.).
> 
> > The problem here is, that we have object state that is not contained in
> > "visible slots" i.e. instance variables. So this would be one case, where 
> > the
> > proposal for a
> 
> There's a much more serious problem with the proposed implementation: it 
> does not cope with graphs of objects that contain cycles.  Do do that you 
> need to keep track of objects copied already.  Marshal does this - and it's 
> efficient.  If you want to do that yourself, you'll likely need a hash[old 
> oid -> copy] to manage this.  I doubt though that it's more efficient than 
> Marshal.
> 
> I had to discover that there's more to deep copying than just traversing the 
> object graph and copying each instance in turn a while ago myself.  I help 
> you can benefit from my earlier errors... :-)
> 
> Kind regards
> 
>     robert
> 

Ok, then back to the original question. If I don't want a general solution, but
want to deep-copy my special class, that contains some instance variables, with
some multi-dimensional arrays in it. What is a nice way to go about it?

Regards,

Brian


-- 
Brian Schröäer
http://www.brian-schroeder.de/