为什么Ruby中修改嵌套哈希某一键值时所有嵌套值都被同步更新?
问题原因
你构造哈希时所有年份对应的嵌套哈希是同一个elements对象的引用:years.collect迭代过程中,仅将预先创建的elements对象反复绑定到不同的年份键上,没有为每个年份生成独立的嵌套哈希实例。因此任意修改某一个年份对应的嵌套哈希,本质都是修改同一个共享对象,所有年份的取值自然会同步更新。
解决方案
方案1:构造哈希时规避共享引用(推荐)
不要提前创建公共的elements对象,迭代年份时为每个年份生成独立的嵌套哈希:
headers = { gastosCompra: 'gastos compra', } hash = years.to_h do |item| elements = headers.inject({}) { |h, (k, _v)| h[k] = 0; h } [item, elements] end
后续你再修改任意年份的嵌套哈希,都不会影响其他年份的取值:
hash[2021][:gastosCompra] = 555 # 仅2021对应的值会更新
方案2:已有哈希的前提下单独修改目标年份
如果已经生成了存在共享引用的哈希,可以在修改前先将目标年份的哈希替换为独立拷贝:
# 替换为独立拷贝,浅拷贝足够适配你当前的单层嵌套结构 hash[2021] = hash[2021].dup # 嵌套层级更深的话可以用深拷贝:hash[2021] = Marshal.load(Marshal.dump(hash[2021])) # 再执行修改操作就只会影响2021对应的值 hash[2021][:gastosCompra] = 555
内容的提问来源于stack exchange,提问作者AlbertMunichMar
相关产品推荐
相关产品推荐

