目次
Ruby では and
と &
、 &&
が使えます。 同様に or
と |
、||
が使えます。 これらの違いについて調べてみました。
環境
- Ruby 2.4.0
and
, &
, &&
は論理積を、 or
, ||
, |
は論理和を期待通り計算してくれます。
違い
注意すべき違いは、演算子の優先順位と、右側の評価です。
優先順位
演算子の優先順位は次のようになっています。
&
|
,^
>
,>=
,<
,<=
==
,!=
&&
||
..
,...
?:
=
not
and
,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
のような挙動です。