From: Brian Candler Date: 2009-10-16T17:03:38+09:00 Subject: Re: deep cloning, how? Caleb Clausen wrote:0 > In general, +clone+ and +dup+ may have different > semantics in descendent classes. While +clone+ is used to duplicate > an object, including its internal state, +dup+ typically uses the > class of the descendent object to create the new instance. > > Frankly, I've never been real sure what this is supposed to mean I *think* what it means is: clone just copies all the instance variables, whilst dup calls self.class.new(). It's quite common for initialize() to have all sorts of side effects, creating new objects and so on. So you can expect dup to do all this, whilst you can expect clone to create an identical object with all the instance variables pointing at the same objects. Nothing enforces that of course, so it's just a convention. The only *real* differences I can see are: - clone also copies the frozen state of the object - clone makes a copy of the singleton class (whereas in dup, by default the newly-created object has an empty singleton class; it's assumed that if there are any methods to be added to that, your own dup method will do that for you, possibly with the assistance of your initialize method) > initialize_copy apparently is used by both dup and clone. You're > right, that should be defined (overridden?) instead of dup/clone > themselves. I rarely remember that. I'm not sure I agree with that. The *default* implementation of both dup and clone does this, as it's the only reasonable thing for Object to do without any knowledge of its subclasses. But I think the spirit of dup described above is that dup defined in a subclass should initialize it using its constructor. Since I never use clone, it's a moot point for me as to what it should do in a subclass. Regards, Brian. -- Posted via http://www.ruby-forum.com/.