ruby - 使用默认值的rails嵌套哈希
问题描述
我想用嵌套的默认值创建一个新的哈希。我认为它应该像
h = Hash.new(count: 0, rating: 0)
所以我可以做类似的事情
h['a'][:count] += 1
h['a'][:rating] += 1
等等。但是当我在控制台中尝试它时,它看起来像这样:
2.3.1 :046 > h = Hash.new(count: 0, rating: 0)
=> {}
2.3.1 :047 > h["a"]
=> {:count=>0, :rating=>0}
2.3.1 :048 > h["a"][:count]
=> 0
2.3.1 :049 > h["a"][:count] += 1
=> 1
2.3.1 :050 > h["b"][:count] += 1
=> 2
2.3.1 :051 > h
=> {}
所以我的问题是:
- 为什么
h["b"][:count] += 1
返回 2 而不是 1? - 为什么h是空的?
提前致谢!
解决方案
Hash::new的文档解释了初始化哈希的三种方法,在您的情况下,您在 Hash 构造函数中使用了一个对象:
如果指定了 obj,则此单个对象将用于所有默认值。
如果您希望每个缺少的键创建它自己的对象,请使用块创建哈希,如下所示:
h = Hash.new { |h,k| h[k] = { count: 0, rating: 0 } }
然后:
2.6.3 :012 > h
=> {}
2.6.3 :013 > h['a'][:count] = 5
=> 5
2.6.3 :015 > h
=> {"a"=>{:count=>5, :rating=>0}}
推荐阅读
- django - YML 配置的 django elasticbeanstalk 部署问题
- node.js - 如何在我的 SPA 的服务器部分更新 Svelte 商店?
- sql - 嵌套案例语句 Teradata 将时间戳(0)、时间戳(6)转换为日期并进行比较
- google-smart-home - QUERY 后报告状态返回错误 503
- reactjs - JSON.stringify 无法序列化循环结构,如何解决?
- python - 与 pytest_generate_tests 一起定义 Fixture
- php - 使用最后一个值作为第一个数组的复选框
- node.js - 如何用玩笑测试线性节点脚本?
- android - Android Studio 3.6.3 启用/禁用离线工作?
- python - QQuickFrameBufferObject 导致 PySide2 崩溃