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と||は思いもよらぬところで計算結果が異なる可能性もある。 きちんと優先順位を把握した上で、使い分けるようにしたい。
参考
