我知道这意味着或
true || false
=> true
但前几天我不小心改用了一条垂直线,发现我的代码仍然有效。
true | false
=> true
false | false
=> false
那么这些有什么区别呢?和||?它们是等价的吗?
我知道这意味着或
true || false
=> true
但前几天我不小心改用了一条垂直线,发现我的代码仍然有效。
true | false
=> true
false | false
=> false
那么这些有什么区别呢?和||?它们是等价的吗?
| 是按位或运算符。|| 是逻辑 OR 运算符。
有关这两个运算符的说明,请参见此处:http ://www.tutorialspoint.com/ruby/ruby_operators.htm 。
|
是按位或运算符。 ||
是逻辑 OR。
如您所演示的那样使用时,主要区别在于||
它将短路,并且当左侧为真时不评估右侧。使用|
将始终评估双方。
在这种情况下,这可能无关紧要 - 但如果运算符的两侧计算成本很高,||
那么效率会更高。
因此,||
在进行逻辑测试(即:“if”)时使用它几乎总是更好,因为这将更清楚地表达您的意图,并且可能更有效。
运算符在|
直接进行位操作时更有用,并且通常仅适用于这些场景。
||
是逻辑或运算符。
a | b
就像a.|(b)
。所以它的含义取决于 的类a
。
Fixnum
如果第一个操作数是: ,它会按位或Fixnum#|
。
如果第一个操作数是true
或,则为逻辑 OR false
: TrueClass#|
, FalseClass#|
; ||
,如果两个操作数都是/ ,|
则产生相同的结果。true
false
NilClass#|
, ...
另一个区别: ||
短路,而|
不会。
例如:
def f1
p 'f1 called'
true
end
def f2
p 'f2 called'
true
end
p(f1 || f2)
# => "f1 called"
# true
p(f1 | f2)
# => "f1 called"
# "f2 called"
# true
1 || 2 # return first non-false/nil value.
# => 1
nil || 1
# => 1
1 | 2 # 0b01 | 0b10 => 0b11 = 3
# => 3
>> nil | 1
# => true
1 | nil
# => TypeError: nil can't be coerced into Fixnum
# from (irb):7:in `|'
# from (irb):7
# from C:/Ruby200-x64/bin/irb:12:in `<main>'