プログラミング学習メモ

RubyとRuby on Rails等

論理演算子のショートサーキット

Rubyには以下の論理演算子があります

&&, ||, and, or, not, !

&&andは二項とも真なら真の論理積||orは二項の片方が真なら真の論理和と呼ばれます。 not,!の論理否定は今回は扱いません。
andor&&||と比べて処理の優先度が低いという違いがあります。

論理演算子Rubyでの動作は以下のようになります。

#Rubyではfalse,nil以外のオブジェクトが全てtrue(真)と扱われる
0 && 1 #=> 1

0 || 1 #=> 0

false && true #=> false

#(0 && 1) or 2 と同義
0 && 1 or 2 #=> 1

なぜ以上のような戻り値になるかというと、

1.最後に評価された値が戻り値になる
2.評価が確定したら右辺を評価しない、ショートサーキットという評価法を用いている

この二点によるものです。

ショートサーキットについて具体例を示すと
&&の場合は

false && true #=>false

左辺のfalseによって真になることはないため、右辺は評価せずfalseが最後に評価された値となります。

||の場合は

true || false #=> true

左辺のtrueで真が確定するため、右辺は評価せずtrueが最後に評価された値となります。

制御フロー

論理演算子はこの性質を利用して制御フローに使用することもできます。

#Aが真ならBを実行する
A && B

#Aが偽ならBを実行する
A || B

例(send_emailというメソッドKernelには存在しません)

#ユーザーが存在するならメールを送る
@user && send_mail(@user)

#ユーザーが存在しないなら処理を抜ける
@user || return(@user)

左辺がnil,falseなら右辺を代入する自己代入演算子||=も、この性質を利用したものです。
上の式は下の式のシンタックスシュガーとなります。

a ||= 1

a = (a || 1)

括弧がついている理由は、代入=より優先度の低い演算子の後に代入を行うためです。