From: Kurt Stephens Date: 2012-03-10T00:02:13+09:00 Subject: [ruby-core:43146] [ruby-trunk - Feature #4514] #deep_clone and #deep_dup for Objects Issue #4514 has been updated by Kurt Stephens. Marc-Andre Lafortune wrote: > 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. > > * 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. > See https://github.com/kstephens/red_steak/blob/master/lib/red_steak/copier.rb The problem is how to control how "deep" a copier should go, which objects need to have identity maintained and which objects are simply containers. The programmer needs control via some protocol with the copier. ---------------------------------------- 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/