Ruby递归/克隆递归

Say*_*yuj 23 ruby hash clone hash-of-hashes dup

我有一个哈希:

h = {'name' => 'sayuj', 
     'age' => 22, 
     'project' => {'project_name' => 'abc', 
                   'duration' => 'prq'}}
Run Code Online (Sandbox Code Playgroud)

我需要一个这个哈希的副本,更改不应该影响原始哈希.

当我尝试时,

d = h.dup # or d = h.clone
d['name'] = 'sayuj1'
d['project']['duration'] = 'xyz'

p d #=> {"name"=>"sayuj1", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
p h #=> {"name"=>"sayuj", "project"=>{"duration"=>"xyz", "project_name"=>"abc"}, "age"=>22}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到project['duration']原始哈希中的更改是因为project是另一个哈希对象.

我想要散列dupedcloned递归.我怎样才能做到这一点?

Ser*_*sev 39

以下是如何在Ruby中制作深层副本

d = Marshal.load( Marshal.dump(h) )
Run Code Online (Sandbox Code Playgroud)

  • 这将创建`h`引用的所有对象的完整副本.这可能正是Sayuj对简单String哈希所需要的.对于更复杂的对象,这可能不再需要了.曾经可以覆盖`Hash#dup`方法以递归方式复制`values`中的所有哈希值.但是需要针对每种对象类型进行扩展. (2认同)
  • @HolgerJust:是的,这就是为什么它被称为"深层复制":-) (2认同)
  • 请注意,当存在默认proc时,这将不起作用(例如,`h = Hash.new {| h,k | h [k] = 1}`) (2认同)