我有一个布尔值数组true
或false
由表示逻辑运算符||
or的字符串分隔&&
,例如:
[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]
然后
a = arr.drop(1) #=> ["&&", false, "||", true]
pairs = a.each_slice(2) #=> #<Enumerator: ["&&", false, "||", true]:each_slice(2)>
我们可以pairs
通过将其转换为数组来查看枚举器将向块发送哪些元素。
pairs.to_a #=> [["&&", false], ["||", true]]
继续(返回值的rv
缩写),我们生成 的第一个元素,将其传递给块并将值分配给块变量和。pairs
op
bool
rv = arr.first #=> true
op, bool = pairs.next #=> ["&&", false]
op #=> "&&"
bool #=> false
我们现在执行块计算。作为
op == '&&' #=> true
块计算并返回以下,这是的新值备忘录,rv
:
rv && bool #=> true && false => false
我们现在生成 的第二个和最后一个元素pairs
,将其传递给块,为块变量赋值(rv
现在回忆一下等于false
)并执行块计算。
op, bool = pairs.next #=> ["||", true]
op #=> "||"
bool #=> true
op == '&&' #=> false
rv || bool #=> false || true #=> true
因此该方法返回true
。
使用内核#EVAL代替
如果我们信任数组中的值,我们可以简单地写
eval [true, '&&', false, '||', true].join #=> true
eval [false, '||', true, '&&', false].join #=> false
采用eval
将允许我们添加"("
,")" and
“!”`到阵列中,大大增加了,可以进行评估(容易)布尔表达式的范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句