Rubyで読みやすいからといって and と or を代入(=)と一緒に使うとさらにややこしい
環境:Ruby 1.9.3
Rubyの演算子と優先度の話で
初歩的な話だけど見落としていたことを書きます。
rubyには 「&&」「||」 演算子の他に「and」「or」があります。
『 あれでしょ、「and」 と 「or」 は優先度が同じだけど、
「&&」は「||」より優先度が高いってやつ。 』
この文章はよく見る。
でも、気をつけなければいけないのは、もう一つ
「and」と「or」は「=」より優先度が低いこと。
まず、「and」と「&&」とかの比較を見てみると、
irb> true || true && false #=> true irb> true or true and false #=> false irb> true || false && false #=> true irb> true or false and false #=> false
という結果になって、
irb> true || (true && false) #=> true irb> (true or true) and false #=> false irb> true || (false && false) #=> true irb> (true or false) and false #=> false
こう解釈される。
同じ解釈をするには、括弧で括ってしまえばいいのだ。
irb> true || (true && false) #=> true irb> true or (true and false) #=> true irb> true || (false && false) #=> true irb> true or (false and false) #=> true
じゃあ、それを代入したらどうなるか。
気をつけるべきは、
「and」と「or」は「=」よりも優先度が低いこと。
これを知らないともっとややこしいことになる。
さっきの解釈結果をそのまま代入してみる。
irb> flag = true || (true && false) #=> true irb> flag #=> true irb> flag = true or (true and false) #=> true irb> flag #=> true irb> flag = true || (false && false) #=> true irb> flag #=> true irb> flag = true or (false and false) #=> true irb> flag #=> true
同じじゃないかと思っても、
irb> flag = "truedayo" and (true or false) #=> false irb> flag #=> "truedayo" irb> flag = "truedayo" && (true || false) #=> false irb> flag #=> false
なんと、flag に一部が代入されてしまった。
気をつけよう。ということでした。
「and」と「or」の使い道は、代入目的で使うというのが正しいのかな。