讃岐小僧のEngineering×Techメモ

未経験から挑戦中のプログラミングや、趣味の野球や狩猟について、その他、ビジネスやテクノロジーをテーマに様々なことをつぶやく場所です。

【Ruby】論理演算子の優先順位について

論理演算子記号論演算子の優先順位

論理演算子記号論演算子の優先順位は下記通りです。

! >> && >> || >> 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を本格的に勉強したいと考えられている方は是非、下記リンクに書籍のリンクを貼っているので確認してみてください。