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 也从未被计算过

还有另一种结构andor(小写)

The and and or keywords serve the same purpose in Ruby. Properly understood, and and or are control flow operators, not boolean operators.

您将它们用作控制流运算符 ifunless。这个操作非常low operator precedence.

进一步阅读:
and or and short-curcuit difference
short-curcuit

如果您查看 [=] 的第 11.2.4 逻辑与表达式 和第 11.2.5 逻辑或表达式 子条款 b) 13=],很容易看出求值是从左到右并且在右操作数惰性(这里例如对于||):

  1. Evaluate the expression or the operator-OR-expression. Let X be the resulting value.
  2. 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.
  3. 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