【发布时间】:2015-07-11 23:21:28
【问题描述】:
我正在尝试通过使用另一个具有默认值的哈希来初始化 ruby 中的哈希。我想要一个深拷贝,但我似乎只得到一个浅拷贝。
这是一个例子:
DEFAULT_HASH = { a: 0, b: 1 }.freeze
my_hash = DEFAULT_HASH.dup
my_hash[:a] = 4
现在“my_hash”和 DEFAULT_HASH 中 a 的值是 4。我只想改变我的哈希值。
我也尝试过其他方法:
my_hash = {}.merge DEFAULT_HASH
和
my_hash.merge! DEFAULT_HASH
所有这些都会产生相同的效果。实现这种初始化的最佳方法是什么。我还在使用嵌套哈希,这会增加一点复杂性。
即我的 DEFAULT_HASH 看起来像:
DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }
这会影响如何执行此操作吗?
编辑: 嵌套哈希案例
DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>2, :b=>1}}
a=DEFAULT_HASH.dup
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>2, :b=>1}}
a[:b][:a]=12
=> 12
DEFAULT_HASH
=> {:a=>{:a=>1, :b=>2}, :b=>{:a=>12, :b=>1}}
【问题讨论】:
-
您使用的是哪个版本的 Ruby?我无法重现你的行为。
-
这是 JRuby 1.7.19 和 Ruby 2.2.0
-
我正在使用类似版本的 Ruby,但我看不到同样的东西。您确定
DEFAULT_HASH正在改变吗? -
肯定的,看看我对这个问题所做的编辑。这是我的 irb 会话的直接输出。可以看到 DEFAULT_HASH[:b][;a] 得到值 12
-
好的,所以我没有用你的 nested 案例对此进行测试;这显然改变了事情。在浅哈希上,我看不到这种行为。