讃岐小僧のEngineering×Techメモ

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

【Ruby】式評価と戻り値のタイミングについて

Rubyにおける式評価と戻り値が決定するタイミング

Rubyにおける真偽値については下記の記事をお読みください。

www.sanuki-kozo.com

Ruby式評価の順番

  1. 式全体が真または偽であることを確認するまで左辺から順に式を評価する
  2. 左から順に評価し、nilまたはfalseが返った時点で式全体が偽となる
  3. 全て真で最後まで評価される場合は真となる

戻り値の決定タイミング

  1. 式全体の真偽が決まった時点に評価された値が戻り値となる
  2. nilまたはfalseが評価された時点で戻り値はnilまたはfalseとなる
  3. 全ての式が評価された場合(真の場合)、最後に評価された値が戻り値になる。

これはreturn構文を説明した時にも同じようなことを書きました。

もしもう一回確認したいという場合は下記でお確かめください。

www.sanuki-kozo.com

それでは説明だけでは定着しそうにないので、実際に実行して見ます。

irb

irb(main):001:0> 1 && 2 && 3
=> 3

今回は全て数字で真なので左から右の端まですべて評価され戻り値として3が返ってきました。

次にnilを入れてみます。

irb(main):002:0> 1 && nil  && 3
=> nil

今回は最後の評価までされず、nilが評価された時点で式全体が偽と決定し評価が終了されるため、その時に評価されたnilが返ってきました。

or や andを使用した場合は違う挙動になる

例えば||でorを表現した場合は最後に評価された式の値を返します。

irb(main):003:0> nil || false
=> false

ここで質問

この場合は戻り値はどうなるでしょう?

nil || false || 2 || 3

.
.
.
.
.
.
.
.
.

はい、正解は2となります!

一旦実行して確かめてみます。

irb(main):004:0> nil || false || 2 || 3
=> 2

はい、やっぱり2が返ってきました。

これは小僧的にも最初は最後に評価がされるであろう、3だと思ったのですが、よく考えると、Rubyにおいて偽となるのはnilとfalseしかないため、nilでもfalseでもない2が評価された時点で、式全体としては真が確定するため、そこで式は終了してしまします。

そう、先ほども書いたのですが、Rubyでは真偽が決まった時点で評価された式の値が戻り値となるためです。


今回はここまで。

最後に

この記事はプロを目指す人のためのRuby入門から学んだことを参考にして内容が作られています。

Rubyを本格的に勉強したいと考えられている方は是非、下記リンクに書籍のリンクを貼っているので確認してみてください。