Ruby 中 OR 和双管运算符之间的区别
or
和 ||
在 Ruby 中都是逻辑运算符;由于它们的相似行为,它们可能会令人困惑。它们之间只有细微的差别,在本教程中,我们将了解它们有何不同以及应如何使用它们。
要记住的一件重要事情是,如果它们出现在不包含其他运算符的表达式中,它们的行为方式相同。否则,它们的行为会有所不同。
当没有其他运算符参与时
在此分类中,两个运算符的行为方式相同,返回第一个真值。
示例代码:
nil or 5
2 or 4
输出:
5
2
示例代码:
nil || 5
2 || 4
输出:
5
2
请注意,在上面的示例中,代码采用 expression
而不是 statement
的形式。结合任何可以使它成为陈述的东西都会产生意想不到的结果。
例如,nil or 5
是一个可以传递的表达式,可能作为方法的参数或分配给变量,而 puts nil or 5
是一个完整的语句。
测试 Ruby 表达式的最佳方法是使用 interactive Ruby
IRB。它预装在 macOS 上。要使用 IRB 进行测试,请按照以下步骤操作。
-
打开一个终端
-
输入
irb
并按 Enter。这将显示一个提示 -
输入你的表达式,例如,
nil || 5
,然后按 Enter -
表达式的结果将显示在下一行
当涉及其他一些运营商时
在评估以下示例中的代码后,我们的重点是 a
的值。
示例代码:
a = nil or 5
b = 2 or 4
puts a
puts b
输出:
nil
2
示例代码:
a = nil || 5
b = 2 || 4
puts a
puts b
输出:
5
2
解释上述行为的最好方法是查看 Ruby 运算符优先表。每当一个表达式由多个运算符组成时,就像我们在上面的示例中那样,我们需要根据它们的优先级来评估它们。
该表显示 =
运算符的优先级高于 or
运算符但低于||
运算符。因此,示例中的评估顺序可以分解如下所示。
(a = nil) or 5
(b = 2) or 4
a = (nil || 5)
b = (2 || 4)
虽然我们决定在上面的例子中使用 =
运算符,但我们可以使用任何高于 or
但低于||
的运算符并获得相同的行为;一个例子是+=
。
示例代码:
a = 1
a += 2 || 4 # a += (2 || 4)
puts a
输出:
3
示例代码:
a = 1
a += 2 or 4 # (a += 2) or 4
puts a
输出:
3
示例代码:
a = 1
a += nil || 5 # a += (nil || 5)
puts a
输出:
6
示例代码:
a = 1
a += nil or 5 # (a += nil) or 5
它将抛出一个 TypeError (nil can't be coerced into Integer)
,因为 Ruby 尝试首先评估括号中的表达式,将 a
增加 nil
。