Ruby中用于更新或插入哈希表的惯用法

3

这段代码是否有一个通用的 Ruby 习惯用法:

if hashmap.has_key?(key)
    hashmap[key] += 1
else
    hashmap[key] = 1
end

感觉这里可能需要一个高阶函数来帮助。我希望有像以下的东西:
hashmap[key].insertOrUpdate { 1 }, {|value| value += 1}

编辑:虽然@Santhosh的答案很酷并且适用于我的特定示例,但我更关心一般情况。我认为@sawa的答案提供了最大的灵活性,因为传递的代码块允许像哈希等复杂逻辑...

4个回答

2
您可以利用 nil.to_i0 这一事实。
hashmap[key] = hashmap[key].to_i + 1

2

您可以使用fetch提供默认值:

hashmap[key] = hashmap.fetch(key, 0) + 1

1

你可以写:

hashmap = {}
key = 'cat'
hashmap[key] = (hashmap[key] || 0) + 1 #=> 1
hashmap[key] = (hashmap[key] || 0) + 1 #=> 2

或者 hashmap[key].to_i + 1,因为 nil.to_i 是零。 - mu is too short
好的,我得记住这个。谢谢,μ。 - Cary Swoveland
nil.to_anil.to_h同样有用,可以将nil转换为“空”对象。 - mu is too short

0

与其你所做的,一个更好的方式是:

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

那么你只需要做:

hashmap[key] += 1

2
我不明白。在定义了hashmap之后,hashmap['cat'] #=> 2 - Cary Swoveland
在这种情况下,默认值应该是0,以匹配我的示例,但总体思路很好,也是我想要的。 - thisisdog
2
你可以不使用块,将其缩短为 hashmap = Hash.new(0) - infused
1
请注意,Hash.new{ |h, k| h[k] = 0 } 在访问键时会设置一个新的键值对。 - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接