Issue #4514 has been updated by Marc-Andre Lafortune.


Hi,

Shyouhei Urabe wrote:
> * It is not always obvious what a "deep" copy is.  For instance it is very hard to define one for a Proc instance.

Agreed, but since Procs do no "contain" anything, I'd say Proc#deep_dup == Proc#dup (except that it would call deep_dup on any instance variables, I imagine).

> * Recursive duplication may not be that simple to implement than you imagine.  For instance an Array can contain itself:
>     r = [].tap {|r| r << r }
>   How do you copy it deeply?

That shouldn't be too hard, we simply maintain a hash with the ids of objects being cloned as keys and with the corresponding new copies as values. I would have fun implementing it. Note that `Marshal::load(Marshal::dump(r))` works for recursive arrays and so does YAML serialization.

I can attest that the question comes up from time to time on StackOverflow, so it is something quite a bit of people wonder about.
----------------------------------------
Feature #4514: #deep_clone and #deep_dup for Objects
https://bugs.ruby-lang.org/issues/4514

Author: Tom Wardrop
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


=begin
There's often a need to do a deep clone of an object, especially of Hash/Array trees. The typical work around to the lack of this functionality is to Marshall and then Unmarshall (e.g. Marshal::load(Marshal::dump(self)) ), which incurs more overhead than it probably should, and is not very semantic. My suggestion is to either provide #deep_clone and #deep_dup methods on the Object class, or to at least provide equivalent functionality for Hashes and Arrays, such as possibly a #deep_merge method for Hash. The exact implantation is not a large concern of mine; I'll let the experts determine the best method of achieving the desired outcome.
=end



-- 
http://bugs.ruby-lang.org/