如何在Ruby中复制哈希?

230

我承认我是一位Ruby新手(目前正在编写rake脚本)。在大多数语言中,复制构造函数很容易找到。但在Ruby中,我搜索了半个小时也没有找到。我想创建哈希表的副本,以便我可以修改它而不影响原始实例。

以下是一些预期不起作用的方法:

h0 = {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
h1=Hash.new(h0)
h2=h1.to_hash

同时,我已经采用了这种不太优雅的解决方法。

def copyhash(inputhash)
  h = Hash.new
  inputhash.each do |pair|
    h.store(pair[0], pair[1])
  end
  return h
end

如果你正在处理普通的Hash对象,提供的答案是很好的。但如果你正在处理来自你无法控制的类似Hash的对象,你应该考虑是否要复制与Hash相关联的单例类。请参见https://dev59.com/FGkw5IYBdhLWcg3wBmGA。 - Sim
13个回答

0

由于 Ruby 有许多种方法可以实现它,这里介绍另一种使用 Enumerable 的方法:

h0 = {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
h1 = h0.inject({}) do |new, (name, value)| 
    new[name] = value;
    new 
end

-1

你可以使用以下内容来深度复制哈希对象。

deeply_copied_hash = Marshal.load(Marshal.dump(original_hash))

18
这是 Wayne Conrad 回答的副本。 - Andrew Grimm

-3

我找到了一种对我有效的深拷贝的替代方法。

h1 = {:a => 'foo'} 
h2 = Hash[h1.to_a]

这会产生一个深拷贝,因为h2是使用h1的数组表示而不是h1的引用形成的。


4
听起来很有前途,但实际上却行不通,这只是另一个浅复制。 - Ginty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接