論理演算子と記号論理演算子の優先順位
! >> && >> || >> not >> and・or
※andとorの優先順位には違いはありません。
利用例
a = true b = false not b || a
この時に返される値
false
ん?ってなりませんでしたか?
not b ・・・ここでfalseではないとまず判断、
次に||でa(true)ときているので
falseではない、または、trueと考える
そのため、この式ではtrueが返ってきそうなのですが、論理演算子の優先度の関係で読み込まれ方が変わってしまいます。
not a || b
の場合はnotより||の優先度が演算子の優先度が高いため、まずa || b
部分が評価され、その部分はtrueと判定される。次にnotが読み込まれるため、式全体としてはfalseとなります。
&&,||をand,orで代用するのはやめよう
先ほども説明したが、そもそも論理演算子と記号論理演算子では同じような働きをするが、優先順位の違いがあるため、利用には気をつけよう。
というのも、Rubyでは基本的に式は左から順に評価されて行くため、そのルールを崩すような論理演算子の使い方、例えば先ほどのサンプルのような記述は避けるべきと小僧は考えている。
悪い例
not b || a
and / orは制御構文に利用する
andや&&など同じような働きをするように思える論理演算子も少しだけ挙動が違う場合がある。
例えば、制御構文にて、Aならばメッセージを送信するという実行するというプログラムがあったとする。
その場合は下記のようなコードを書くと思います。
A? && send_message_to user
しかしこれではエラーとなります。
なぜなら&&を利用した場合は読み込まれ方がこんな感じになる。
(A?) && (send_message_to) user
※&&を利用してエラーを回避したい場合はuserの部分を()で囲ってあげる必要がる。
A? && send_message_to (user)
しかしand
を利用した場合は()で囲ってあげるなど特別な処理をする必要はないので下記のように書ける。
A? and send_message_to user
読み込まれ方としてはこのようになります。
(A?) and (send_message_to user)
今回はここまで
最後に
この記事はプロを目指す人のためのRuby入門から学んだことを参考にして内容が作られています。
Rubyを本格的に勉強したいと考えられている方は是非、下記リンクに書籍のリンクを貼っているので確認してみてください。