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