“或”和|之间有什么区别在红宝石?

时间:2017-07-11 20:14:15

标签: ruby logical-operators

我认为唯一的区别在于|||,其中|等同于or。但我意识到后者是不正确的,现在我很困惑。

AMEND :我理解这个问题与ruby bitwise or不同,而我的意思是缺乏对按位和布尔运算符之间差异的理解,正如评论和答案中所指出的那样。 此外,在我看来,这个问题的答案对问题本身更为相关和清晰。标记为重复会阻止用户获得更好的答案。

2 个答案:

答案 0 :(得分:4)

|运算符是二进制数学运算符,即它执行二进制OR并在数值级别上运行:

1 | 2
# => 3
4 | 3
# => 7
1 | 2 | 3
# => 3

这是因为它正在操纵单个值,就好像它们是二进制的一样:

0b01 | 0b10
# => 3 (0b11)

||运算符是逻辑运算符,即它返回逻辑上为真的第一个值。在Ruby中,只有文字nilfalse值的逻辑判断为false,其他所有内容(包括0,空字符串和数组)都为真。

所以:

1 || 2
# => 1
0 || 1
# => 0

or运算符与||几乎完全相同,只是它的优先级要低得多。这意味着首先评估其他运营商,如果您没有预料到这一点,可能会导致一些问题:

a = false || true
# => true
a
# => true

a = false or true
# => true
a
# => false

这是因为它实际上被解释为:

(a = false) or true

这是因为=在评估时有higher precedence

答案 1 :(得分:1)

||or是特殊的内置运算符。这意味着他们可以(实际上)具有无法用Ruby表达的行为。特别是,||or在他们的右操作数中是非严格和懒惰的,而Ruby实际上是一种严格而热切的语言。

OTOH,|只是一个方法调用,就像任何其他方法调用一样。它绝对没有什么特别之处。这意味着:

  • 严格
  • 渴望
  • 任何对象都可以选择响应它,但它想要

||or是语言内置运算符,

  • 在他们的右操作数中非严格
  • 在他们的右操作数中懒惰
  • 他们的行为是硬编码的,独立于任何特定对象,它始终是相同的,无法更改

||or之间的唯一区别是优先级:or的优先级非常低(并且它与and的优先级相同)。