Rubyのand
と&&
、or
と||
は意味は同じだが演算子の優先順位が異なる。 and
と&&
の意味は、まず左辺を評価して結果が真なら右辺も評価するという意味。 or
と||
の意味は、まず左辺を評価して結果が偽なら右辺も評価するという意味。 and
とor
の優先順位はとても低く、&&
と||
の優先順位はそれより多少高い。
一例として以下のソースコードを実行してみると良い。
foo = :foo
bar = nil
a = foo and bar
p a #=> :foo
a = foo && bar
p a #=> nil
a = foo and bar
の評価結果はa
に:foo
が代入される。 これはa = foo
が先に評価されて、優先順位の低いand
はその後に評価されるためだ。 括弧を使って書き下すと以下と同様である。
(a = foo) and bar
一方でa = foo && bar
の評価結果はa
にnil
が代入される。 これは直感どおりfoo && bar
が先に評価されてnil
となりa
に代入されるためだ。 括弧を使って書き下すと以下と同様である。
a = (foo && bar)
このようにand
と&&
、or
と||
は思いもよらぬところで計算結果が異なる可能性もある。 きちんと優先順位を把握した上で、使い分けるようにしたい。
参考