Ruby 中的逻辑 OR / AND 术语评估顺序
Logic OR / AND term evaluation order in Ruby
在Ruby中,对于二元逻辑运算符AND和OR,项的求值顺序是什么,即在
这样的指令中
if bool1 || bool2
首先检查哪个布尔值?是否如直觉所暗示的那样从左到右?如果第一个已经为真(或者在 AND 的情况下为假),是否还需要检查两者?
当需要检查 2 个条件时,这是特别有趣的,但我们只对验证第二个条件(例如,更耗资源的检查)感兴趣,前提是第一个条件失败。
搜索此信息通常会找到运算符优先级表,特别是运算符关联性,但如您所见,这不是我要找的。
Ruby社区常用的是short-circuit
评价,其中&&
代表AND
,||
代表OR
It means in a conditional statement with two conditions the second condition is evaluated only when the first condition is not enough to determine the value of expression
所以让我们以&&
、||
为例
def a
puts 'a method'
false
end
def b
'b method'
true
end
a && b
# 'a method'
# => false
b 从未被评估
def a
puts 'a method'
true
end
def b
'b method'
false
end
a || b
# 'a method'
# => true
b 也从未被计算过
还有另一种结构and
,or
(小写)
The and and or keywords serve the same purpose in Ruby. Properly understood, and and or are control flow operators, not boolean operators.
您将它们用作控制流运算符 if
、unless
。这个操作非常low operator precedence.
如果您查看 [=] 的第 11.2.4 逻辑与表达式 和第 11.2.5 逻辑或表达式 子条款 b) 13=],很容易看出求值是从左到右并且在右操作数惰性(这里例如对于||
):
- Evaluate the expression or the operator-OR-expression. Let X be the resulting value.
- If X is a falseish object, evaluate the keyword-NOT-expression or the operator-AND-expression. Let Y be the resulting value. The value of the keyword-OR-expression or operator-OR-expression is Y.
- Otherwise, the value of the keyword-OR-expression or operator-OR-expression is X.
你也可以自己看看:
(p('left'); :left) || (p('right'); :right)
# left
#=> :left
(p('left'); :left) || (p('right'); false)
# left
#=> :left
(p('left'); nil) || (p('right'); :right)
# left
# right
#=> :right
(p('left'); nil) || (p('right'); false)
# left
# right
#=> false
(p('left'); :left) && (p('right'); :right)
# left
# right
#=> :right
(p('left'); :left) && (p('right'); false)
# left
# right
#=> false
(p('left'); nil) && (p('right'); :right)
# left
#=> nil
(p('left'); nil) && (p('right'); false)
# left
#=> nil
在Ruby中,对于二元逻辑运算符AND和OR,项的求值顺序是什么,即在
这样的指令中if bool1 || bool2
首先检查哪个布尔值?是否如直觉所暗示的那样从左到右?如果第一个已经为真(或者在 AND 的情况下为假),是否还需要检查两者?
当需要检查 2 个条件时,这是特别有趣的,但我们只对验证第二个条件(例如,更耗资源的检查)感兴趣,前提是第一个条件失败。
搜索此信息通常会找到运算符优先级表,特别是运算符关联性,但如您所见,这不是我要找的。
Ruby社区常用的是short-circuit
评价,其中&&
代表AND
,||
代表OR
It means in a conditional statement with two conditions the second condition is evaluated only when the first condition is not enough to determine the value of expression
所以让我们以&&
、||
def a
puts 'a method'
false
end
def b
'b method'
true
end
a && b
# 'a method'
# => false
b 从未被评估
def a
puts 'a method'
true
end
def b
'b method'
false
end
a || b
# 'a method'
# => true
b 也从未被计算过
还有另一种结构and
,or
(小写)
The and and or keywords serve the same purpose in Ruby. Properly understood, and and or are control flow operators, not boolean operators.
您将它们用作控制流运算符 if
、unless
。这个操作非常low operator precedence.
如果您查看 [=] 的第 11.2.4 逻辑与表达式 和第 11.2.5 逻辑或表达式 子条款 b) 13=],很容易看出求值是从左到右并且在右操作数惰性(这里例如对于||
):
- Evaluate the expression or the operator-OR-expression. Let X be the resulting value.
- If X is a falseish object, evaluate the keyword-NOT-expression or the operator-AND-expression. Let Y be the resulting value. The value of the keyword-OR-expression or operator-OR-expression is Y.
- Otherwise, the value of the keyword-OR-expression or operator-OR-expression is X.
你也可以自己看看:
(p('left'); :left) || (p('right'); :right)
# left
#=> :left
(p('left'); :left) || (p('right'); false)
# left
#=> :left
(p('left'); nil) || (p('right'); :right)
# left
# right
#=> :right
(p('left'); nil) || (p('right'); false)
# left
# right
#=> false
(p('left'); :left) && (p('right'); :right)
# left
# right
#=> :right
(p('left'); :left) && (p('right'); false)
# left
# right
#=> false
(p('left'); nil) && (p('right'); :right)
# left
#=> nil
(p('left'); nil) && (p('right'); false)
# left
#=> nil