我无法将merge_method 方法添加到Hash 类中,不仅因为它污染了一个核心类,还因为它只适用于一小部分哈希值,所有值的哈希值是数字。
可以refineHash,就像@Amadan 所做的那样,但我认为简单地创建一个类似于模块方法的方法更有意义,该方法表现为函数(例如,Math::sqrt),它采用所有哈希值作为论据。
def sum_values_by_key(*hashes)
hashes.each_with_object(Hash.new(0)) { |g,h| g.each { |k,v| h[k] += v } }
end
sum_values_by_key({ "a" => 200, "b" => 100 }, { "b" => 100, "c" => 300 })
#=> {"a"=>200, "b"=>200, "c"=>300}
sum_values_by_key({ "a" => 200, "b" => 100 }, { "b" => 100, "c" => 300 },
{ "a" => 150, "c" => 250 })
#=> {"a"=>350, "b"=>200, "c"=>550}
这使用Hash::new 的形式定义一个默认值,这里是零。表达式:
h[k] += v
扩展到:
h[k] = h[k] + v
如果此哈希已定义h = Hash.new(0) 并且h 有一个键k,则计算相等右侧的h[k] 以返回k 的值。但是,如果h 没有键k,则右侧的h[k] 返回默认值零,变为:
h[k] = 0 + v
我还更改了方法名称以使其更有意义。