gpt4 book ai didi

ruby - 在 Ruby 中复制哈希

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:30 25 4
gpt4 key购买 nike

我正在尝试通过使用具有默认值的另一个散列来初始化 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}}

最佳答案

对于@pjs 的观点,Hash#dup 将为哈希的顶层“做正确的事”。然而,对于嵌套哈希,它仍然失败。

如果您愿意使用 gem,请考虑使用 deep_enumerable ,我正是出于这个目的(以及其他目的)而写的 gem。

DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }
dupped = DEFAULT_HASH.dup

dupped[:a][:a] = 'updated'

puts "dupped: #{dupped.inspect}"
puts "DEFAULT_HASH: #{DEFAULT_HASH.inspect}"


require 'deep_enumerable'
DEFAULT_HASH = { a:{a:1, b:2}, b:{a:2, b:1} }

deep_dupped = DEFAULT_HASH.deep_dup
deep_dupped[:a][:a] = 'updated'

puts "deep_dupped: #{deep_dupped.inspect}"
puts "DEFAULT_HASH: #{DEFAULT_HASH.inspect}"

输出:

dupped:       {:a=>{:a=>"updated", :b=>2}, :b=>{:a=>2, :b=>1}}
DEFAULT_HASH: {:a=>{:a=>"updated", :b=>2}, :b=>{:a=>2, :b=>1}}

deep_dupped: {:a=>{:a=>"updated", :b=>2}, :b=>{:a=>2, :b=>1}}
DEFAULT_HASH: {:a=>{:a=>1, :b=>2}, :b=>{:a=>2, :b=>1}}

或者,您可以尝试以下方法:

def deep_dup(h)
Hash[h.map{|k, v| [k,
if v.is_a?(Hash)
deep_dup(v)
else
v.dup rescue v
end
]}]
end

请注意,最后一个函数的测试远不及 deep_enumerable

关于ruby - 在 Ruby 中复制哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com