LoginSignup
57
43

More than 3 years have passed since last update.

Rubyのand,&&とor,||の違いと注意点

Last updated at Posted at 2018-10-27

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を利用して、それ以外では&&を使う様にしています。

57
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
43