Table of Contents
Ruby では and と &、 && が使えます。 同様に or と |、|| が使えます。 これらの違いについて調べてみました。
環境
- Ruby 2.4.0
and, &, && は論理積を、 or, ||, | は論理和を期待通り計算してくれます。
違い
注意すべき違いは、演算子の優先順位と、右側の評価です。
優先順位
演算子の優先順位は次のようになっています。
&|,^>,>=,<,<===,!=&&||..,...?:=notand,or
ここからわかるように、下のような演算結果になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
a = 1 & 2 == 2 # a = (1 & 2) == 2 # => false a = 1 and 2 == 2 # => true 2 == 2 and not 1 == 2 # => true 2 == 2 && not 1 == 2 # => syntax error, unexpected tINTEGER, expecting '(' 2 == 2 && not (1 == 2) # => true |
& は上の例ではビット演算となっていますが、 bool値同士の演算もできます。
|
1 2 3 4 5 |
false & true # => false true & true # => true |
右側評価
演算子の右側を評価するか否かが違います。 これは優先順位によるものでもあるのですが。
|
1 2 3 4 5 6 7 8 9 10 11 |
(1 == (s = 1)) & (1 == 2) & ((w = 2) == 3) # => false # w == 2 (1 == (s = 1)) && (1 == 2) && ((w = 2) == 3) # => false # w == nil (1 == (s = 1)) and (1 == 2) and ((w = 2) == 3) # => false # w == nil |
and, && の場合は左側が false の場合右側を評価しないようになっています。 VisualBasic でいう AndAlso のような挙動です。