我认为唯一的区别在于|
和||
,其中|
等同于or
。但我意识到后者是不正确的,现在我很困惑。
AMEND :我理解这个问题与ruby bitwise or不同,而我的意思是缺乏对按位和布尔运算符之间差异的理解,正如评论和答案中所指出的那样。 此外,在我看来,这个问题的答案对问题本身更为相关和清晰。标记为重复会阻止用户获得更好的答案。
答案 0 :(得分:4)
|
运算符是二进制数学运算符,即它执行二进制OR并在数值级别上运行:
1 | 2
# => 3
4 | 3
# => 7
1 | 2 | 3
# => 3
这是因为它正在操纵单个值,就好像它们是二进制的一样:
0b01 | 0b10
# => 3 (0b11)
||
运算符是逻辑运算符,即它返回逻辑上为真的第一个值。在Ruby中,只有文字nil
和false
值的逻辑判断为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
的优先级相同)。