检查nil和更新哈希值的最佳方法

时间:2014-05-15 16:09:24

标签: ruby arrays hash

我有一个散列,其值是所有数组。我想在这个哈希中查找一个键。如果它存在,我想为数组添加一个值。如果它不存在(hash [key]返回nil),那么我需要创建数组并添加一个值。目前我有这个:

hash[key].push elem unless hash[key].nul?
hash[key] ||= [elem]

这涉及3次查找。我是红宝石的新手,所以我确信有更好的方法可以做到这一点。它是什么?

我原来的计划是为hash []设置默认值。然后我可以使用:

hash[key].push elem

不幸的是,如果密钥不存在,那只会更改默认值而不会添加新密钥。

3 个答案:

答案 0 :(得分:5)

在这种情况下,您需要创建一个哈希,如下所示:

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

创建以上内容是为了处理像你这样的情况。看new {|hash, key| block } → new_hash

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

hash[:key1] << 1
hash[:key2] << 2
hash[:key1] << 3

hash # => {:key1=>[1, 3], :key2=>[2]}

答案 1 :(得分:2)

您可以尝试:

(hash[key] ||= []) << elem

然而,奥雅纳的答案要好得多。

答案 2 :(得分:0)

您应该使用默认值创建哈希。

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