You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何评估含布尔值与逻辑运算符的数组?Ruby实现求助

解决布尔数组的左结合逻辑运算问题

嘿,这个需求很明确,我来帮你搞定!你想用each_slice(3).reduce的思路其实方向对,但确实需要调整一下逻辑——不过先给你一个更简洁直观的实现方案,再回头说你的思路怎么优化。

最优实现:拆分初始值+逐对运算

你的核心需求是从左到右依次左结合运算:先算前三个元素的结果,再用这个结果和下一个运算符、下一个值继续计算,以此类推。这种场景下,直接拆分初始值+遍历后续的「运算符+值」对会更清晰:

# 示例数组
bool_array = [true, "||", false, "&&", true]

# 核心逻辑
result = bool_array[1..-1].each_slice(2).reduce(bool_array.first) do |acc, (op, val)|
  case op
  when "||" then acc || val
  when "&&" then acc && val
  else
    raise "不支持的运算符:#{op}" # 可选的错误处理
  end
end

puts result # 输出:true

逻辑解释:

  1. bool_array.first取第一个布尔值作为运算的初始累计值(acc)
  2. bool_array[1..-1].each_slice(2)把剩下的元素按「运算符、值」的规则分组,比如示例中会得到[["||", false], ["&&", true]]
  3. 在reduce块里,每次用当前累计值acc,结合分组里的运算符op和值val,计算出新的累计值,直到所有组处理完成

这个方法完美贴合你的需求,而且代码简洁易读,还能轻松处理任意长度的合法数组(只要是「布尔值+运算符+布尔值+...」的交替结构)。


你的each_slice(3).reduce思路怎么调整?

如果一定要用each_slice(3)的方式,需要处理第一次迭代是完整三元组、后续迭代是「运算符+值」二元组的情况,代码会稍显繁琐,但也能实现:

bool_array = [true, "||", false, "&&", true]

result = bool_array.each_slice(3).to_a.reduce do |acc, slice|
  # 判断当前累计值是数组(第一次迭代)还是布尔值(后续迭代)
  if acc.is_a?(Array)
    # 第一次迭代:计算三元组的结果
    val1, op, val2 = acc
    current_val = op == "||" ? val1 || val2 : val1 && val2
    # 如果当前slice是二元组,继续运算
    if slice.size == 2
      op_next, val_next = slice
      current_val = op_next == "||" ? current_val || val_next : current_val && val_next
    end
    current_val
  else
    # 后续迭代:用累计值和二元组运算
    op, val = slice
    op == "||" ? acc || val : acc && val
  end
end

puts result # 输出:true

为什么不推荐这个方案?

因为当数组长度不是3的倍数时,each_slice(3)会生成长度不足3的分组,需要额外判断处理,代码复杂度更高,不如第一种方法直观。


测试验证

可以用几个不同的数组测试逻辑是否正确:

  • 输入[false, "&&", true, "||", true] → 输出true((false && true) || true)
  • 输入[true, "&&", false, "&&", true] → 输出false((true && false) && true)
  • 输入[false, "||", false, "||", true] → 输出true((false || false) || true)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:55