【发布时间】:2024-01-08 17:25:02
【问题描述】:
我有一个这样的哈希:
entity = {1=> nil, 2 => {3 => nil, 4 => 1}}
我写了一个函数,它可以使用递归删除给定实体的空值。
def clear_null_values(entity)
entity.each do |key, value|
if value == nil || value.blank?
entity.delete(key)
elsif value.is_a? Hash
clear_null_values(value)
entity.delete(key) if value.blank?
end
end
end
而且我还需要原始实体用于其他目的。所以我复制了哈希变量,然后清除了空值。
final_entity = entity.dup
clear_null_values(entity)
puts entity
puts final_entity
结果:
{2 => {4 => 1}}
{1=> nil, 2 => {4 => 1}} # the nested values are overwritten.
理想情况下,final_entity 应该与原始实体相同。
问题1:为什么entity.dup只复制outerhash?
问题2:如何使 final_entity 完全复制原始实体,即即使我们修改实体,那么 final_entity 也不应该改变?
【问题讨论】:
-
我知道您想计算
{2 => {4 => 1}},但不明白{1=> nil, 2 => {4 => 1}}是如何确定的,因为它只包含nil中的一个nil值entity。我相信您的问题需要 Rails 标记,因为blank不是 Ruby 方法。 -
你的问题是什么?
-
用标签和更多解释更新了问题。
-
@CarySwoveland 没有构造
{1=> nil, 2 => {4 => 1}}的标准,因为措辞不当的问题是如何避免这个结果并拥有final_entity == 原始实体,entity.dup产生的问题仅适用于最外层的哈希. -
@Michael,我明白了。 “result”后面的第二行是OP的错误结果,不是想要的结果。
标签: ruby-on-rails ruby hash clone dup