在附加到数组之前将哈希条目设置为数组的ruby惯用方法是什么?

时间:2013-12-30 04:10:04

标签: ruby hash

我正在尝试创建一个哈希,其中包含一个键和一个与键关联的值数组。 所以我正在做这样的事情

 hash = Hash.new

然后当我有钥匙时我会这样做

 hash[key] << new_thing

但如果hash [key]为nil,则会失败,所以我在尝试将new_thing附加到数组之前添加了此语句。

 hash[key] = Array.new unless hash[key] 
 hash[key] << new_thing

我认为我可以通过将哈希的定义更改为

来消除添加的语句
hash = Hash.new Array.new 

但这不起作用,因为每个条目共享相同的数组,我真正需要的是这个

hash = Hash.new { |h,k| h[k] = Array.new }

我知道我可能会分裂头发,但我很好奇,这样做的“红宝石”会是什么样的?

修改 最终我最终做的是使用group_by。我意识到我的问题并不明显,我试图使用这个结构在散列中将具有相同属性的对象组合在一起。我将此包括在内以鼓励可能发现自己使用类似结构的其他人出于类似目的查看group_by

["A", 1, "b", 3].group_by { |i| i.class }
=> {String=>["A", "b"], Fixnum=>[1, 3]}

3 个答案:

答案 0 :(得分:4)

将一个空数组设置为Hash默认值的Ruby方法是使用你问题中的default_proc版本:

hash = Hash.new { |h,k| h[k] = [ ] }

例如:

> hash = Hash.new { |h,k| h[k] = [ ] }
> hash[:pancakes] << 6
> hash
 => {:pancakes=>[6]} 

在编写Ruby时使用标准的Ruby功能对我来说似乎很漂亮。

答案 1 :(得分:0)

我看到人们经常这样做:

(h[key] ||= []) << value

因为这是明确的方式,并且像显性一样。

你的版本也很常见。

顺便说一句,您可以在现有哈希上设置默认值:

h.default_proc = ->(h, k){ h[k] = [] }

h.default = 0

我发现它有点清洁,但没有广泛使用。

答案 2 :(得分:-3)

您可以设置default

numbers = Hash.new(0)