首页 > 解决方案 > 使用默认值的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
 => {}

所以我的问题是:

提前致谢!

标签: rubyhash

解决方案


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

推荐阅读