かつての RuboCop は condition and return
というコードに対して、condition && return
にするようデフォルトでサジェスチョンしていた。
このサジェスチョンはおかしく見えたので、結構前に構成を変えてデフォルトで condition and return
を受け入れるようにしている。
- https://github.com/rubocop-hq/rubocop-rails/pull/224
- https://github.com/rubocop-hq/rubocop/pull/7959
このあたり Ruby での演算子の結合順位をおさらいすると、以下のとおり。
&&
||
and
,or
サジェスチョンされるがまま演算子を変えると、結果が変わるサンプルです。
% ruby -e 'p false || true and return' # p(false || true) and return と等価 true % ruby -e 'p false || true && return' # p(false || (true && return)) と等価 # noop
このように結合順位の関係から、条件式と制御フローをつなげる時は &&
より and
を一貫して使う方が原則好ましいと思っています。
参考までに上述している RuboCop Rails の PR にも書いていますが、Rails で DoubleRenderError
が起きた時のメッセージで示されるのは render :action and return
です。
auto-correct されたから常に正しいわけではないので、おかしいと思うケースと遭遇したときは立ち止まってもう一度レビューしてみましょう。
あとこういったおかしいところを地道になおして行っていたりもしているので、RuboCop のバージョンが古い場合はアップデートしてみてください。