Rubyのandと&&、orと||の違い
タグ: ruby / 初版公開: 2014-03-05

Rubyのand&&or||は意味は同じだが演算子の優先順位が異なる。 and&&の意味は、まず左辺を評価して結果が真なら右辺も評価するという意味。 or||の意味は、まず左辺を評価して結果が偽なら右辺も評価するという意味。 andorの優先順位はとても低く、&&||の優先順位はそれより多少高い。

一例として以下のソースコードを実行してみると良い。

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の評価結果はanilが代入される。 これは直感どおりfoo && barが先に評価されてnilとなりaに代入されるためだ。 括弧を使って書き下すと以下と同様である。

a = (foo && bar)

このようにand&&or||は思いもよらぬところで計算結果が異なる可能性もある。 きちんと優先順位を把握した上で、使い分けるようにしたい。

参考