ruby - 具有默认值的 Rails 嵌套哈希

标签 ruby hash

<分区>

我想创建一个具有嵌套默认值的新哈希。我觉得应该是这样的

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 的文档解释了初始化哈希的三种方法,在您的情况下,您在哈希构造函数中使用了一个对象:

If obj is specified, this single object will be used for all default values.

如果您希望每个丢失的键都创建它自己的对象,请使用 block 创建散列,如下所示:

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}} 

关于ruby - 具有默认值的 Rails 嵌套哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58172635/

相关文章:

c++ - 当 T 是 std::pair<std::hash 也支持的两种更简单的类型> 时,std::hash<T> 应该工作吗?

mysql - 如何使用 Rails 优化此查询

ruby - 为什么一个类继承自一个结构

ruby - Jekyll 存档页面中的嵌套液体循环不起作用。在内部条件中使用外部循环变量

ruby - 初始化哈希

security - 如何存储和验证从 PIN/密码中随机选择的数字

ruby - 如何在 ruby​​ 中将字符串更改为 http 形式?比如#到%23

ruby - 无法使用 Sinatra 启动 Mongoid

sql-server - SQL Server 中的 HashBytes 函数(错误的 MD5 结果)

ruby - 有没有办法通过散列来初始化对象?