Rubyでは基本的にAND条件とOR条件に&&と||を使います。
他方でandとorも構文ではサポートされています。従って、Python経験がある身としては、andとorを使いそうになってしまうときがあります。
※ PythonではAND条件とOR条件にはandとorを使う
しかし、一般的なRubyのコードでandとorを使っているケースはほとんど見ません。Rubocopの標準にもandとorの使用をチェックするルールが存在します。
従って、なぜ原則は&&と||を使ったほうがよいのかを確認したいと思います。
理由
&&、||、andとorはそれぞれ演算子の評価の優先順位が異なり、andとorは直観に反する挙動をする場合があるからです。
演算子の評価の優先順位は公式ドキュメントに明記されています。
andとorは「低い」に分類されています。
挙動が変わる代表的な例としてAIが挙げたのは以下でした。
a = true && false # aには`false`が代入される b = true and false # bには`true`が代入される
1個目は&&の方が=よりも優先的に評価されるため、aにはtrue && falseの評価結果であるfalseが代入されます。
これは直観的な挙動です。
他方で2個目は、=の方がandよりも優先的に評価されるため、先にb = trueが実行されます。次にb(true) && falseが実行されます。評価結果自体はfalseですが、この結果は捨てられるので、変数bの値は意図とは異なりtrueになってしまいます。
このようなバグのリスクがあるので、原則は&&と||を使うようです。