Ruby 如何计算布尔值和逻辑运算符数组

Ruby 如何计算布尔值和逻辑运算符数组,ruby,Ruby,我有一个布尔值数组true或false,由表示逻辑运算符|或&的字符串分隔,例如: [true, "||", false, "&&", true] 数组大小不是固定的。我想计算前三个元素[true、| |“、false],然后计算结果加上数组的剩余部分 我正在考虑使用: array.each_slice(3).to_a.reduce 但是我不确定在reduce块中要传递什么。这里需要一些指导。代码 def evaluate(arr) pairs = arr.drop(1)

我有一个布尔值数组
true
false
,由表示逻辑运算符
|
&
的字符串分隔,例如:

[true, "||", false, "&&", true]
数组大小不是固定的。我想计算前三个元素
[true、| |“、false]
,然后计算结果加上数组的剩余部分

我正在考虑使用:

array.each_slice(3).to_a.reduce
但是我不确定在
reduce
块中要传递什么。这里需要一些指导。

代码

def evaluate(arr)
  pairs = arr.drop(1).each_slice(2)
  pairs.reduce(arr.first) { |rv, (op, bool)| op == '&&' ? rv && bool : rv || bool }
end
示例

evaluate [true, '&&', false, '||', true]   #=> true
evaluate [false, '||', true, '&&', false]  #=> false
解释

假设

arr = [true, '&&', false, '||', true]
然后

继续(
rv
是返回值的缩写),我们生成
对的第一个元素
,将其传递给块,并将值分配给块变量
op
bool

rv = arr.first          #=> true
op, bool = pairs.next   #=> ["&&", false]
op                      #=> "&&"
bool                    #=> false
我们现在执行块计算。作为

op == '&&'              #=> true
块计算并返回以下内容,即备忘录的新值,
rv

rv && bool              #=> true && false => false
现在,我们生成
对的第二个和最后一个元素,将其传递给块,为块变量赋值(调用
rv
现在等于
false
),并执行块计算

op, bool = pairs.next   #=> ["||", true]
op                      #=> "||"
bool                    #=> true

op == '&&'              #=> false
rv || bool              #=> false || true #=> true
因此,该方法返回
true

改用

如果我们信任数组中的值,我们可以简单地编写

eval [true, '&&', false, '||', true].join  #=> true
eval [false, '||', true, '&&', false].join #=> false

使用
eval
可以将
“(“
”)和
“!”`添加到数组中,大大增加了可计算的布尔表达式的范围(很容易).

我认为当使用
eval
时,您可以使用
arr.join
即不使用
'
字符参数。感谢您的明确解释。这就是我要找的。我接受了你的回答@SagarPandya感谢您的建议。不清楚您所说的“评估前三个要素……评估结果加上剩余的艺术……”是什么意思
op, bool = pairs.next   #=> ["||", true]
op                      #=> "||"
bool                    #=> true

op == '&&'              #=> false
rv || bool              #=> false || true #=> true
eval [true, '&&', false, '||', true].join  #=> true
eval [false, '||', true, '&&', false].join #=> false