为什么在合并另一个哈希时更新嵌套哈希的所有值?
Why all values of a nested hash are updated when merging another hash?
我有以下哈希:
hash = {2021=>{:gastosCompra=>0}, 2022=>{:gastosCompra=>0}, 2023=>{:gastosCompra=>0}}
创建如下
headers = {
gastosCompra: 'gastos compra',
}
elements = headers.inject({}) { |h, (k, _v)| h[k] = 0; h }
hash = Hash[years.collect { |item| [item, elements] }]
我正在尝试更新 key year 2021
的 gastosCompra
。我试过 merge
、deep_merge
,但不幸的是所有其他键也都更新了:
hash[year][:gastosCompra] = 555
hash[year].merge!({gastosCompra: 555})
hash[year].deep_merge!({gastosCompra: 555})
这是结果:
hash = {2021=>{:gastosCompra=>555}, 2022=>{:gastosCompra=>555}, 2023=>{:gastosCompra=>555}}
如果我只想更新 2021 年,为什么要更新所有嵌套的哈希值?我想我可以遍历这些键并在找到 2021 年时停止,但我想避免这种情况。
它们的对象 ID 都相同,你必须复制你的 elements
散列。
他们都指的是同一个地址。
在 ruby 中有一个黄色的副本:
Object#dup
: https://ruby-doc.org/core-3.0.3/Object.html#method-i-dup
hash = Hash[years.collect { |item| [item, elements.dup] }]
或
Kernel#clone
: https://ruby-doc.org/core-3.0.3/Kernel.html#method-i-clone
您也可以使用 ActiveSupport 进行深层复制:https://api.rubyonrails.org/classes/Hash.html#method-i-deep_dup
仅供参考 -> 请参阅 Ruby Marshal class,它在某些情况下很有用:https://ruby-doc.org/core-3.0.3/Marshal.html
我有以下哈希:
hash = {2021=>{:gastosCompra=>0}, 2022=>{:gastosCompra=>0}, 2023=>{:gastosCompra=>0}}
创建如下
headers = {
gastosCompra: 'gastos compra',
}
elements = headers.inject({}) { |h, (k, _v)| h[k] = 0; h }
hash = Hash[years.collect { |item| [item, elements] }]
我正在尝试更新 key year 2021
的 gastosCompra
。我试过 merge
、deep_merge
,但不幸的是所有其他键也都更新了:
hash[year][:gastosCompra] = 555
hash[year].merge!({gastosCompra: 555})
hash[year].deep_merge!({gastosCompra: 555})
这是结果:
hash = {2021=>{:gastosCompra=>555}, 2022=>{:gastosCompra=>555}, 2023=>{:gastosCompra=>555}}
如果我只想更新 2021 年,为什么要更新所有嵌套的哈希值?我想我可以遍历这些键并在找到 2021 年时停止,但我想避免这种情况。
它们的对象 ID 都相同,你必须复制你的 elements
散列。
他们都指的是同一个地址。
在 ruby 中有一个黄色的副本:
Object#dup
: https://ruby-doc.org/core-3.0.3/Object.html#method-i-dup
hash = Hash[years.collect { |item| [item, elements.dup] }]
或
Kernel#clone
: https://ruby-doc.org/core-3.0.3/Kernel.html#method-i-clone
您也可以使用 ActiveSupport 进行深层复制:https://api.rubyonrails.org/classes/Hash.html#method-i-deep_dup
仅供参考 -> 请参阅 Ruby Marshal class,它在某些情况下很有用:https://ruby-doc.org/core-3.0.3/Marshal.html