这个问题在这里已有答案:
我正在尝试创建一个哈希,其中包含一个键和一个与键关联的值数组。所以我做了这样的事情
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 = 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]}
将空数组设置为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功能对我来说似乎很漂亮。
我见过人们经常这样做:
(h[key] ||= []) << value
因为这是明确的方式,而且像擦除一样明显。
你的版本也很常见。
顺便说一句,您可以在现有哈希上设置默认值:
h.default_proc = ->(h, k){ h[k] = [] }
要么
h.default = 0
我发现它有点清洁,但没有广泛使用。
你可以设置default值
numbers = Hash.new(0)