Sk.*_*fan 0 ruby hash clone ruby-on-rails dup
我有这样的哈希:
entity = {1=> nil, 2 => {3 => nil, 4 => 1}}
Run Code Online (Sandbox Code Playgroud)
我编写了一个函数,可以使用递归删除给定实体的空值.
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
Run Code Online (Sandbox Code Playgroud)
而且我还需要原始实体以用于其他目的.所以我复制了哈希变量,然后清除了空值.
final_entity = entity.dup
clear_null_values(entity)
puts entity
puts final_entity
Run Code Online (Sandbox Code Playgroud)
结果:
{2 => {4 => 1}}
{1=> nil, 2 => {4 => 1}} # the nested values are overwritten.
Run Code Online (Sandbox Code Playgroud)
理想情况下,final_entity应与原始实体相同.
问题1:为什么entity.dup复制只是外部的?
问题2:如何使final_entity成为原始实体的完全副本,即使我们修改实体,那么final_entity也不应该改变?
请尝试使用deep_dup原始代码 - 仅dup使用最外层的哈希.
final_entity = entity.deep_dup
clear_null_values(entity)
puts entity
puts final_entity
Run Code Online (Sandbox Code Playgroud)
输出:
{2=>{4=>1}}
{1=>nil, 2=>{3=>nil, 4=>1}}
Run Code Online (Sandbox Code Playgroud)
注意:Rails还会添加Hash#compact,您可以使用它来简化clear_null_values.
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |