You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ruby中基于布尔运算合并两个布尔值哈希的惯用方法

Ruby实现哈希逻辑联合运算的惯用方式

在Ruby里,要实现你描述的这种哈希逻辑联合操作,最地道的写法是用Hash#merge配合自定义的冲突处理块——这也是Ruby社区里处理这类哈希合并需求的惯用方式。

完全匹配示例需求的实现

a = {a:true, b:true, c:true, d:false, e:false, g:false, h:nil, i:nil, j:nil}
b = {a:true, b:false, c:nil, d:true, e:false, g:nil, h:true, i:false, j:nil}

result = a.merge(b) do |key, val_a, val_b|
  # 只要其中一个值是nil,结果保留nil;否则取两个布尔值的逻辑与
  val_a.nil? || val_b.nil? ? nil : val_a && val_b
end

# 验证结果是否符合预期
result == {a:true, b:false, c:nil, d:false, e:false, g:nil, h:nil, i:nil, j:nil}
# => true

逻辑说明

  • Hash#merge会自动处理所有存在于ab中的键:对于只在单个哈希里出现的键,直接保留对应值;对于同时存在的键,会触发我们传入的块来计算新值。
  • 块内的逻辑完全贴合你的要求:如果任意一个值是nil,就返回nil;否则对两个布尔值执行逻辑与(&&)运算,得到最终结果。

你提到的可替代方案(nil参与运算返回false)

如果你的场景允许把nil当作false来处理,代码可以更简洁,利用Ruby的真值/假值特性:

result = a.merge(b) do |key, val_a, val_b|
  !!val_a && !!val_b
end

这里的!!会把任意值转换为对应的布尔值:!!nil等于false!!true等于true!!false等于false,这样所有涉及nil的运算都会返回false,符合你说的可接受情况。

内容的提问来源于stack exchange,提问作者psychoslave

火山引擎 最新活动