てみたの不思議空間【後ろ】

フィーリングで感じたことを書く

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」の使い道は、代入目的で使うというのが正しいのかな。