ruby 用于更新或插入哈希图的习惯用法
ruby idiom for update or insert a hashmap
这段代码有没有通用的ruby习语:
if hashmap.has_key?(key)
hashmap[key] += 1
else
hashmap[key] = 1
end
感觉这里可能有一个高阶函数可以提供帮助。我希望有类似
的东西
hashmap[key].insertOrUpdate { 1 }, {|value| value += 1}
编辑: 虽然@Santhosh 的回答很酷并且适用于我的特定示例,但我对一般情况更感兴趣。我认为@sawa 的回答提供了最大的灵活性,因为传入的代码块允许复杂的逻辑,如散列的散列等...
你可以这样写:
hashmap = {}
key = 'cat'
hashmap[key] = (hashmap[key] || 0) + 1 #=> 1
hashmap[key] = (hashmap[key] || 0) + 1 #=> 2
而不是你所做的,更好的方法是:
hashmap = Hash.new{|h, k| h[k] = 0}
那你只需要做:
hashmap[key] += 1
您可以利用 nil.to_i
是 0
这一事实
hashmap[key] = hashmap[key].to_i + 1
您可以使用fetch
提供默认值:
hashmap[key] = hashmap.fetch(key, 0) + 1
这段代码有没有通用的ruby习语:
if hashmap.has_key?(key)
hashmap[key] += 1
else
hashmap[key] = 1
end
感觉这里可能有一个高阶函数可以提供帮助。我希望有类似
的东西hashmap[key].insertOrUpdate { 1 }, {|value| value += 1}
编辑: 虽然@Santhosh 的回答很酷并且适用于我的特定示例,但我对一般情况更感兴趣。我认为@sawa 的回答提供了最大的灵活性,因为传入的代码块允许复杂的逻辑,如散列的散列等...
你可以这样写:
hashmap = {}
key = 'cat'
hashmap[key] = (hashmap[key] || 0) + 1 #=> 1
hashmap[key] = (hashmap[key] || 0) + 1 #=> 2
而不是你所做的,更好的方法是:
hashmap = Hash.new{|h, k| h[k] = 0}
那你只需要做:
hashmap[key] += 1
您可以利用 nil.to_i
是 0
hashmap[key] = hashmap[key].to_i + 1
您可以使用fetch
提供默认值:
hashmap[key] = hashmap.fetch(key, 0) + 1