【Ruby】論理演算子と代入の組み合わせ

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。

論理演算子は下記のようなルールに基づいて演算が行われることになります。

  • 左から順に評価
  • 真偽が決定すると残りの式は評価されない(短絡評価)
  • 最後に評価された式が演算の値となる

論理演算子「||」(OR演算、論理和)

OR演算を行う場合は「||」という演算子が使われます。

論理和は簡単に言うと両方の命題(式)のいずれかが真、または両方が真である場合に真となります。両方が偽である場合には偽となります。

それでは下記のスクリプトを見ていきましょう。

今回は最後の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番目の式の値が返ってきています。

これでは少しわかりづらいので下記のスクリプトで確認してみましょう。

aは偽です

Rubyではnilとfalseのみ偽と判断されます。今回の場合「a」は偽となり、bはnilとfalse以外の値(文字列のオブジェクト)が入っているため2番目の式の値が返ってきます。それでは「a」の式が真となった場合を見ていきましょう。

aは真です

上記を見てみると1番目の式で真となったため「b」の式は評価されずに「a」の式の値が返ってきていることが良くわかりますね。最後に両方とも偽だった場合も念のため見ていきましょう。

nil

両方とも偽となりますが、最後に評価された式の値が返ってくるので、今回の演算の結果「偽」となり、最後の評価「nil」が返ってくることになります。

代入と論理演算子「||」の組み合わせ

上記の演算の戻り値を応用した代入の方法をみていきましょう。まず、下記のような値があるとして「a」が偽の場合にのみ「b」の文字列を変数「a」に代入する方法をみていきます。

普通にunless文を使った場合は↓のようになります。

aは偽なので代入します
unless文
if文の逆バージョンで式が偽の場合に実行される構文です

「a」が真の場合

念のため変数「a」が真の場合もみて行きましょう。

aは真となるのでbは代入されません

まあ、当たり前ですが、aは真となるのでunless文は実行されず「b」は「a」に代入されません。

論理演算子「||」を使って代入

上記のunless文を使って代入する方法は論理演算子「||」を使っても同じような表現ができます。

aは偽なので代入します

これは「a || b」で「a」が偽となり、「b」の式が評価されます。評価されると「b」の文字列が最終の評価として返ってきます。最後に評価された式(今回は文字列)が「a」に代入される。

代入演算子「||=」を使う

この形は代入演算子で表現するともっと簡単に記述することができます。

aは偽なので代入します

上記の「||=」は「a」が偽(false、nil)である場合に代入されるといった流れになります。これは他の人が書くスクリプトにも良く出てくるので覚えておいた方が良いでしょう。

論理演算子「&&」(AND演算、論理積)

AND演算では「&&」という論理演算子がつかわれます。

論理積は両方の命題(式)が真となる場合にのみ真となります。それ以外は偽となります。

下記のスクリプトで確認するとこんな感じになります。

短絡評価からの戻り値

今回の場合は先程の「||」とは逆で初めの式の評価が「true」(真)の場合に2番目の式の評価が行われます。3、4行目のように初めの式が「false」(偽)の場合は次の式が「true」であっても「false」であっても結果は既に偽となったのでそこで式の評価はストップし、1番目式の値が論理積全体の値となり、返ってきます。

それでは下記のスクリプトを見ていき、整理してみましょう。

aは真です

今回の場合は「a」が真となったので2番目の式「b」の評価が行われることになります。その結果「b」も真となり、論理積は「真」となります。最後の式の評価が論理式全体の値となるので結果的に「”aは真です”」という文字列が返ってきています。

次に「a」が偽となった場合を見ていきましょう。

false

今回は「a」の段階で「false」となったため、それ以降の式が「偽」であっても「真」であっても全体では「偽」となることが明白です。したがって処理は初めの式「a」で終了します。

最後に「a」が真「b」が偽となった場合を見ていきます。

false

この場合は初めの式は真となるため2番目の式が評価されることになります。結果的に「b」はfalseとなるので式全体の値はfalseとなります。

代入と論理演算子「&&」の組み合わせ

まず、下記のような変数「a」「b」があったとします。そこで「a」が真の場合に「b」の値を代入する方法を見ていきます。今回はさっきとは逆に「if」文を使って書いてみましょう。

代入

「a」が偽の場合

こちらでも念のため「a」が偽となった場合を見ていきましょう。

false

論理演算子「&&」を使って代入

ここで上記の「if」文と同じ処理を論理演算子「&&」で行ってみましょう。

代入

この書き方を行うことで「a && b」の論理式の全体の値が、文字列「”代入”」となり、最終的に変数「a」に代入されることになります。

代入演算子「&&=」を使う

そしてこの形も代入演算子「&&=」をつかうともっと簡単に書くことができます。

代入
false

まとめ

話が結構長くなり、少しややこしくなってしまったので下記にまとめてみます。

論理演算子をつかった結果は3つの特徴があって、なんやかんやで

  • 代入演算子「||=」⇒偽(false、nil)の場合に代入するスクリプトを書ける
  • 代入演算子「&&=」⇒真の場合に代入するスクリプトを簡単に書ける

ということになります。ほんとすみません。。

私自身、代入演算子「||=」「&&=」がどのような順序で処理されているのか気になっていたので調べてわかったことを書いていったら結構長くなり、まとまりがない文章が出来上がってしまいました。。。

ですが、この記事が「||=」「&&=」について疑問に思っている方の解決の糸口となれば嬉しく思います。

最後に今回参考にさせて頂いたページを貼っていくつか貼っておきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。