ruby-on-rails - ruby 中的递归函数正在覆盖 cloned(object.dup) 变量的嵌套属性
问题描述
我有一个这样的哈希:
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 也不应该改变?
解决方案
尝试deep_dup
改用,您的原始代码仅dup
-ed 最外层的哈希。
final_entity = entity.deep_dup
clear_null_values(entity)
puts entity
puts final_entity
输出:
{2=>{4=>1}}
{1=>nil, 2=>{3=>nil, 4=>1}}
注意:Rails 还添加了Hash#compact
,您可以使用它来简化clear_null_values
.
推荐阅读
- openssl - 我正在尝试实现一对使用 SSL 创建自签名证书以在它们之间传递一些数据的 AWS 服务器
- bnf - 这三个非终结符(expr、term 和 factor)在这个整数算术表达式的 BNF 中是什么意思?
- java - 在 selenium JAVA 中提取文本 br 标签
- java - 在spring boot中从属性文件中注入值数组
- javascript - 将 Array 对象转换为字符串 jquery
- http - 什么被认为是 HTTP 标头中的空白
- php - MySQL 注册案例
- php - 比较时间时获取数据
- multithreading - 在 QThread.exit() 上立即停止处理事件队列
- hashmap - 如何在 GDB 中漂亮地打印 Rust HashMap?