Ruby中如何仅拷贝两个哈希共有键对应的值
Ruby 哈希按共同键拷贝值的简洁实现
你需要的「从源哈希拷贝值,仅保留两个哈希共同存在的键对应的取值」需求,不需要手动逐个键赋值,Ruby 提供了非常简洁的原生实现:
最优写法(Ruby 2.5+ 原生支持)
直接使用 Hash#slice 方法,该方法会返回原哈希中仅包含指定键的子集:
h1 = {a: 10, b: 20, c: 30} h2 = {a: nil, c: nil} result = h1.slice(*h2.keys) # 运行结果:{a: 10, c: 30}
写法中h2.keys会获取h2的所有键,*是数组展开运算符,会把键数组拆成独立参数传给slice方法。不管两个哈希有多少个共同键,这行代码都不需要调整,完全没有冗余。
低版本兼容写法
如果你的Ruby版本低于2.5(没有原生Hash#slice),可以用键判断的方式实现,效果完全一致:
# 方法1:select 筛选共同键 result = h1.select { |key, _| h2.key?(key) } # 方法2:先取两个哈希的键交集,再构造新哈希 common_keys = h1.keys & h2.keys result = common_keys.to_h { |key| [key, h1[key]] }
注意事项
以上所有实现都遵循需求逻辑:只要键在两个哈希中同时存在,无论h2中对应键的值是nil、false还是其他内容,都会取h1中对应键的值作为结果,和示例预期完全匹配。
内容的提问来源于stack exchange,提问作者stevec
相关产品推荐
相关产品推荐

