Rubyのand,&&とor,||の違いと注意点
同じだと思っていると微妙な違いによって
意外なところで落とし穴に陥る危険があります('-')
実は優先度が違う
以下のリファレンスマニュアルを見ると以下の様に記載されています
演算子式
左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。 and は同じ働きをする優先順位の低い演算子です
定義は && も and も「左辺を評価し、真である場合右辺も評価する」というものです。
しかし、記載の通りandは優先順位が低い演算子です。
優先順位が低いって何?
論より証拠で以下に例を示します。
a = true && false
p a #false
b = true and false
p b #true
c = (true and false)
p c #false
上の実行結果をコメントに記載しましたが、全然挙動が違いますね。
これが優先順位の差です。
優先順位とは演算子の優先順位のことを指します。
この場合、&&は=よりも優先度が高いが、andは=よりも優先度が低いからこそこういう事象がおきてしまうのです。
つまり、
a = true && false
の場合は、まずtrue && false
が評価され、その結果がaに代入されます。
b = true and false
の場合は、b = true
が評価され、その後and false
が実行されるのです。
演算子の優先度
じゃあどの演算子がどの演算子より優先度が高いかというと以下の様に順位づけされています。
(優先順位:高)
! ~
**
* / %
+ -
<< >>
&
| ^
> >= < <=
== !=
&&
||
.. ...
?:
=
not
and or
(優先順位:低)
andとorを&&,||の様に使用してしまっていると優先度の違いからこちらの意図しない結果になってしまうことがあるかもしれません。
優先度を意識して実装するようにしていきましょう。
true and return
なので、以下の様な左辺を満たす時はreturnするみたいな時には特に注意が必要で、
a.empty? and return "poe"
と記載することになり、以下の様に&&と記載し直すとうまくいきません。
a.empty? && return "poe"
ただ、
a.empty? && (return "poe")
とすることでうまくいくようです。
私は、
true and return
の様な処理を行う時だけはandを利用して、それ以外では&&を使う様にしています。