論理演算子のショートサーキット
&&, ||, and, or, not, !
&&
とand
は二項とも真なら真の論理積
、
||
とor
は二項の片方が真なら真の論理和
と呼ばれます。 not
,!
の論理否定は今回は扱いません。
and
とor
は&&
と||
と比べて処理の優先度が低いという違いがあります。
#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)
括弧がついている理由は、代入=
より優先度の低い演算子の後に代入を行うためです。