論理演算子は下記のようなルールに基づいて演算が行われることになります。
- 左から順に評価
- 真偽が決定すると残りの式は評価されない(短絡評価)
- 最後に評価された式が演算の値となる
Contents
論理演算子「||」(OR演算、論理和)
OR演算を行う場合は「||」という演算子が使われます。
それでは下記のスクリプトを見ていきましょう。
1 2 3 4 |
p true || true #=> true p true || false #=> true p false || true #=> true p false || false #=> false |
今回は最後の4行目のみ両方ともfalse(偽)となっているので最後のみfalseが返ってくることになります。
短絡評価
それでは先程の論理演算子のルールを思い出してみましょう。
1、2行目のスクリプトでは初めの式でtrue(真)となっているので2番目の式は実際のところ評価されていません。評価しなくても初めのtrueとなった時点でその後「false」が出てきても「true」が出てきても演算の結果は「true」となりますから、Rubyでは無駄に評価はしない仕様となっているようです。
3、4行目では初めがfalse(偽)になっているのでまだ、演算の結果が出せません。そこで2つ目の式の評価を行う流れになります。
演算の戻り値
最後に評価された式の値が返ってくるので1、2行目の「true」は1番目の式の値となり、3行目では2番目の式を評価した結果「true」が返ってきています。4行目も3行目と同じく2番目の式の値が返ってきています。
これでは少しわかりづらいので下記のスクリプトで確認してみましょう。
1 2 3 |
a = false b = "aは偽です" puts a || b |
aは偽です
Rubyではnilとfalseのみ偽と判断されます。今回の場合「a」は偽となり、bはnilとfalse以外の値(文字列のオブジェクト)が入っているため2番目の式の値が返ってきます。それでは「a」の式が真となった場合を見ていきましょう。
1 2 3 |
a = "aは真です" b = "aは偽です" puts a || b |
aは真です
上記を見てみると1番目の式で真となったため「b」の式は評価されずに「a」の式の値が返ってきていることが良くわかりますね。最後に両方とも偽だった場合も念のため見ていきましょう。
1 |
p false || nil |
nil
両方とも偽となりますが、最後に評価された式の値が返ってくるので、今回の演算の結果「偽」となり、最後の評価「nil」が返ってくることになります。
代入と論理演算子「||」の組み合わせ
上記の演算の戻り値を応用した代入の方法をみていきましょう。まず、下記のような値があるとして「a」が偽の場合にのみ「b」の文字列を変数「a」に代入する方法をみていきます。
1 2 |
a = false b = "aは偽なので代入します" |
普通にunless文を使った場合は↓のようになります。
1 2 3 4 |
unless a a = b end puts a |
aは偽なので代入します
if文の逆バージョンで式が偽の場合に実行される構文です
「a」が真の場合
念のため変数「a」が真の場合もみて行きましょう。
1 2 3 4 5 6 |
a = "aは真となるのでbは代入されません" b = "aは偽なので代入します" unless a a = b end puts a |
aは真となるのでbは代入されません
まあ、当たり前ですが、aは真となるのでunless文は実行されず「b」は「a」に代入されません。
論理演算子「||」を使って代入
上記のunless文を使って代入する方法は論理演算子「||」を使っても同じような表現ができます。
1 2 3 4 |
a = false b = "aは偽なので代入します" a = a || b puts a |
aは偽なので代入します
これは「a || b」で「a」が偽となり、「b」の式が評価されます。評価されると「b」の文字列が最終の評価として返ってきます。最後に評価された式(今回は文字列)が「a」に代入される。
代入演算子「||=」を使う
この形は代入演算子で表現するともっと簡単に記述することができます。
1 2 3 4 |
a = false b = "aは偽なので代入します" a ||= b puts a |
aは偽なので代入します
上記の「||=」は「a」が偽(false、nil)である場合に代入されるといった流れになります。これは他の人が書くスクリプトにも良く出てくるので覚えておいた方が良いでしょう。
論理演算子「&&」(AND演算、論理積)
AND演算では「&&」という論理演算子がつかわれます。
下記のスクリプトで確認するとこんな感じになります。
1 2 3 4 |
p true && true #=> true p true && false #=> false p false && true #=> false p false && false #=> false |
短絡評価からの戻り値
今回の場合は先程の「||」とは逆で初めの式の評価が「true」(真)の場合に2番目の式の評価が行われます。3、4行目のように初めの式が「false」(偽)の場合は次の式が「true」であっても「false」であっても結果は既に偽となったのでそこで式の評価はストップし、1番目式の値が論理積全体の値となり、返ってきます。
それでは下記のスクリプトを見ていき、整理してみましょう。
1 2 3 |
a = true b = "aは真です" puts a && b |
aは真です
今回の場合は「a」が真となったので2番目の式「b」の評価が行われることになります。その結果「b」も真となり、論理積は「真」となります。最後の式の評価が論理式全体の値となるので結果的に「”aは真です”」という文字列が返ってきています。
次に「a」が偽となった場合を見ていきましょう。
1 2 3 |
a = false b = "aは真です" puts a && b |
false
今回は「a」の段階で「false」となったため、それ以降の式が「偽」であっても「真」であっても全体では「偽」となることが明白です。したがって処理は初めの式「a」で終了します。
最後に「a」が真「b」が偽となった場合を見ていきます。
1 2 3 |
a = "aは真です" b = false p a && b |
false
この場合は初めの式は真となるため2番目の式が評価されることになります。結果的に「b」はfalseとなるので式全体の値はfalseとなります。
代入と論理演算子「&&」の組み合わせ
まず、下記のような変数「a」「b」があったとします。そこで「a」が真の場合に「b」の値を代入する方法を見ていきます。今回はさっきとは逆に「if」文を使って書いてみましょう。
1 2 3 4 5 6 7 |
a = true b = "代入" if a a = b end puts a |
代入
「a」が偽の場合
こちらでも念のため「a」が偽となった場合を見ていきましょう。
1 2 3 4 5 6 7 |
a = false b = "代入" if a a = b end puts a |
false
論理演算子「&&」を使って代入
ここで上記の「if」文と同じ処理を論理演算子「&&」で行ってみましょう。
1 2 3 4 |
a = false b = "代入" a = a && b puts a |
代入
この書き方を行うことで「a && b」の論理式の全体の値が、文字列「”代入”」となり、最終的に変数「a」に代入されることになります。
代入演算子「&&=」を使う
そしてこの形も代入演算子「&&=」をつかうともっと簡単に書くことができます。
1 2 3 4 5 6 7 8 9 10 11 |
# a = true の場合 a = true b = "代入" a &&= b puts a # a = false の場合 a = false b = "代入" a &&= b puts a |
代入 false
まとめ
話が結構長くなり、少しややこしくなってしまったので下記にまとめてみます。
論理演算子をつかった結果は3つの特徴があって、なんやかんやで
- 代入演算子「||=」⇒偽(false、nil)の場合に代入するスクリプトを書ける
- 代入演算子「&&=」⇒真の場合に代入するスクリプトを簡単に書ける
ということになります。ほんとすみません。。
私自身、代入演算子「||=」「&&=」がどのような順序で処理されているのか気になっていたので調べてわかったことを書いていったら結構長くなり、まとまりがない文章が出来上がってしまいました。。。
ですが、この記事が「||=」「&&=」について疑問に思っている方の解決の糸口となれば嬉しく思います。
最後に今回参考にさせて頂いたページを貼っていくつか貼っておきます。
コメントを残す