在ruby中实现合并方法

在ruby中实现合并方法,ruby,merge,hashmap,array-merge,Ruby,Merge,Hashmap,Array Merge,我试图在代码中实现merge方法 A = { "a" => 200, "b" => 100 } B = { "b" => 100, "c" => 300 } 因此,当我在主函数中调用A.merge\u方法(B)时,它应该返回 A.merge_method(B) #=> {"a"=>200, "b"=>200, "c"=>300} 如何在不使用merge方法的情况下实现?这里是一般的想法:收集任何要合并的哈希的所有键,然后针对每个键,收集所有具有

我试图在代码中实现merge方法

A = { "a" => 200, "b" => 100 }
B = { "b" => 100, "c" => 300 }
因此,当我在主函数中调用
A.merge\u方法(B)
时,它应该返回

A.merge_method(B) #=> {"a"=>200, "b"=>200, "c"=>300}

如何在不使用merge方法的情况下实现?

这里是一般的想法:收集任何要合并的哈希的所有键,然后针对每个键,收集所有具有该键的哈希中的值,并对它们求和

module HashWithMergeReduce
  refine Hash do
    def merge_reduce(*others, &op)
      hashes = [self, *others]
      hash_keys = hashes.map(&:keys).inject(Set.new, &:+)
      hash_keys.each do |key|
        hashes_with_key = hashes.select { |hash| hash.has_key?(key) }
        self[key] = hashes_with_key.map { |hash| hash[key] }.reduce(&op)
      end
      self
    end
  end
end

module TestHashWithMergeReduce
  using HashWithMergeReduce
  a = { "a" => 200, "b" => 100 }
  b = { "b" => 100, "c" => 300 }  
  puts a.merge_reduce(b, &:+)
  # => {"a"=>200, "b"=>200, "c"=>300}
end

我无法将方法
merge\u method
添加到类
Hash
,这不仅是因为它污染了一个核心类,而且还因为它只适用于所有值都是数字的散列的一小部分

可以像@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

它使用的形式定义了一个默认值,这里是零。表达方式:

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

我还更改了方法名称以使其更有意义。

我遇到了以下错误:':未初始化的常量TestHashWithMergeReduce::HashWithMergeReduce(名称错误)非常奇怪,它的定义就在它上面。(如果您在Irb中执行它,它应该可以正常工作;如果您在文件中执行它,您将需要
require'set'
;但是我能看到您得到错误的唯一方法是,如果您只执行我代码的下半部分。)显然,您也可以编写它,而无需优化。
h[k] = 0 + v