什么是|之间的区别与||

时间:2013-10-23 16:43:18

标签: ruby

我知道这意味着或

 true || false
 => true

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

true | false
=> true

false | false
=> false

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

3 个答案:

答案 0 :(得分:3)

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

请参阅此处以获取有关两个运营商的说明:http://www.tutorialspoint.com/ruby/ruby_operators.htm

答案 1 :(得分:2)

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

当您演示时使用的主要区别是||将短路,而当左侧为真时,不会评估右侧。使用|将始终评估双方。

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

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

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

答案 2 :(得分:2)

||是逻辑OR运算符。


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

如果第一个操作数为FixnumFixnum#|,则按位OR;

逻辑OR如果第一个操作数是truefalseTrueClass#|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>'