1

我知道这意味着或

 true || false
 => true

但前几天我不小心改用了一条垂直线,发现我的代码仍然有效。

true | false
=> true

false | false
=> false

那么这些有什么区别呢?和||?它们是等价的吗?

4

3 回答 3

3

| 是按位或运算符。|| 是逻辑 OR 运算符。

有关这两个运算符的说明,请参见此处:http ://www.tutorialspoint.com/ruby/ruby_operators.htm 。

于 2013-10-23T16:47:18.810 回答
2

|按位或运算符。 ||逻辑 OR

如您所演示的那样使用时,主要区别在于||它将短路,并且当左侧为真时不评估右侧。使用|将始终评估双方。

在这种情况下,这可能无关紧要 - 但如果运算符的两侧计算成本很高,||那么效率会更高。

因此,||在进行逻辑测试(即:“if”)时使用它几乎总是更好,因为这将更清楚地表达您的意图,并且可能更有效。

运算符在|直接进行位操作时更有用,并且通常仅适用于这些场景。

于 2013-10-23T16:49:31.273 回答
2

||是逻辑或运算符。


a | b就像a.|(b)。所以它的含义取决于 的类a

Fixnum如果第一个操作数是: ,它会按位或Fixnum#|

如果第一个操作数是true或,则为逻辑 OR false: TrueClass#|, FalseClass#|; ||,如果两个操作数都是/ ,|则产生相同的结果。truefalse

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>'
于 2013-10-23T16:50:52.433 回答