ruby - 在 ruby 中实现合并方法
问题描述
我正在尝试在我的代码中实现合并方法。
A = { "a" => 200, "b" => 100 }
B = { "b" => 100, "c" => 300 }
所以当我调用A.merge_method(B)
我的主函数时,它应该返回
A.merge_method(B) #=> {"a"=>200, "b"=>200, "c"=>300}
不使用合并方法如何实现?
解决方案
这是一般的想法:收集要合并的任何散列的所有键,然后对于每个键,收集具有该键的所有散列中的值,并对它们求和。
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
推荐阅读
- amazon-web-services - GCP 堆栈中的 AWS SNS 等效项
- java - 示例项目之间为 Active Directory 返回的 AccessToken 不同
- docker - Docker npm 在 debian 中找不到:jessie20180831
- javascript - style.left 不会更新
- node.js - 测试安全的 graphql 订阅
- statsvn - REG : 如何在 svn 1.10.2 中运行 StatSVN
- java - 我的程序中有一个错误提示错误:预期的类、接口或枚举。该怎么办?
- android - Android 8 上的 Cordova 插件文件传输问题
- php - PHP PDO 数组结果返回但不适用于 IF
- vue.js - 在组件外部的 Vue JS 中改变一个 Prop