#追記
こちらの記事には誤った理解による解説が含まれています。詳しくは@scivola様のコメントをお読みください。
#||は「または」と理解しないほうが良い
ruby初学者が||
この記号に触れるのは条件式の話の中が多いと思います。そして、これはどちらかが真ならtrueを返す「または」を意味する記号ですと紹介されます。
これはもちろん正しいのですが応用の利かないとらえ方です。
例えば ex ||= true
←こういったイディオムが理解しにくくなります。
#||のより良い理解
結論からいうと||は「最初に左辺を評価し、偽で合った場合のみ右辺を評価する記号」です。
左辺が真であれば、そこで終了するので右辺の評価にかかわらずtrueを返す。左辺が偽なら右辺を評価し、結果が真ならtrueを返す。結果的に左右どちらかが真であればtrueを返す記号となります。
これを踏まえて先ほどのイディオムをみると、まずこれはex||(ex=true)
の省略系です(a+=2
などと同様です。)。
すなわち、exという変数が定義されてnilでない場合そこで終了し、偽の場合は右辺が評価され、trueがexに代入されるということになります。
つまり||=
というイディオムは左辺が未定義または偽なら代入の意味となるため、nilガードなどと呼ばれているのです。
#&&は?
&&も同様に「左辺を評価し、真で合った場合のみ右辺を評価する記号である」と捉えたほうが良いと思います。
email = Email.find_by_id(id)
if email && email.destroy
#処理
end
このコードで&&
を使わないとidにあったレコードが見つからない場合nilクラスに対してdestroyが呼び出されエラーとなってしまいます。
上記のコードではemailがtrueを返す、つまりnilでなく存在する場合のみ右辺の式を実行するためエラーがでなくなります。
#まとめ
基本的なこともしっかり理解するのが大切。