如何评估含布尔值与逻辑运算符的数组?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
逻辑解释:
bool_array.first取第一个布尔值作为运算的初始累计值(acc)bool_array[1..-1].each_slice(2)把剩下的元素按「运算符、值」的规则分组,比如示例中会得到[["||", false], ["&&", true]]- 在
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
相关产品推荐
相关产品推荐

