こんにちは、てくてーくです。
今回はRailsで出てくる『 ||= 』です。
今までの人生においてあまり『 || 』の記号は見慣れていないため知識が定着せず
どう書くんだっけなあと忘れることが多かったのでまとめてみました。
||= とは何か?
『 ||= 』は or equals (オア イコールズ)と呼ばれる代入演算子です。Rubyでは広く使われているイディオム(慣用句)のようです。
コンピュータープログラムでは次に示すような記法で変数を一つ増やすことができます。
rails c
>> x = 1
=> 1
>> x += 1
=> 2
>> x *= 2
=> 4
>> x /= 2
=> 2
どの演算もx = x ● y → x ●= y という短縮形になっています。
またRubyでは変数の値がnilならば変数に代入するかnilでなければ代入しない(変数の値を変えない)という操作が多く使われます。
そのときにor演算子『||』は次のように使えます。
rails c
>> @teku
=> nil
>> @teku = @teku || "te-ku"
=> "te-ku"
nilの論理値はfalseになるので@tekuへの最初の代入『 @teku || “te-ku” 』の評価値は”te-ku”になります。
論理値:true(真)かfalse(偽)のどちらかの値のこと
Rubyではnilとfalseを除いてあらゆる論理値がtrueになるように設計されています。
さらにRubyでは || (or 演算子)をいくつも連続して用いて各項を評価する場合は左側から順に評価していって、trueになった時点でたとえ評価をしていない項が右にあったとしても処理を終了する設計になっています。
rails c
>> @rail
=> nil
>> @rail = @rail || "rails" || "ruby"
=> "rails"
このように||(or演算子)を用いて左から右に評価していきtrueになった時点で処理を終了する評価の方法を短絡評価(short-circuit evaluation)と呼ぶそうです。
そしてこの||(or演算子)についても上で示した方法で省略できます。
rails c
>> @ruby
=> nil
>> @ruby ||= "on"
=> "on"
これが『 ||= 』(or equals)の正体です。
『 @ruby ||= “on” 』 は 『 @ruby = @ruby || “on” 』の省略形なのです。
まとめ
- ||= はRubyのイディオムでor equalsと読む
- 他の演算子と同様に省略して表記すると ||= となる
- Rubyはnilとfalseを除いてあらゆる論理値がtrueになるように設計されている
一見すると難しそうな『 ||= 』ですがよくみてみると結構簡単ですね。今まであまり馴染みのない記号が出てくるとなんだか怯んでしまいますが、恐れずに立ち向かえばなんてことありませんでした。
コメント