環境
Ruby2.6
はじめに
x ||= 1のような書き方をすることを、自己代入と呼びます。他言語からRubyに移った人から見れば、パッと見ただけでは、「何をやっているのだろう?」と思うものです。ググってみると、変数の値が下記の場合、右辺の値(この場合1)をセットするとあります。
- nil
- false
- 変数が定義されていない
3パターンに当てはまらない場合は、変数が現時点で保持している値を、そのまま維持し続けることになります。つまり、1に変換されません。
動作確認
x変数が未定義の場合、右辺の1を返します。x変数が未定義ということは、ロジックの上位個所で、x変数がまだ一度も現れていないということになります。x変数を始めて定義して、初期値に1をセットしたことと同じ意味になります。つまり、x = 1と同じです。
x ||= 1 # => 1
x変数に、nil or falseがセットされている場合、1に置き換えるという意味になります。
x = nil
x ||= 1 # => 1
x = false
x ||= 1 # => 1
nilと "" は別物です。nilの場合は1に置き換えても、""の場合は1に置き換えません。falseの場合は1に置き換えても、trueの場合は1に置き換えません。Boolean型とその他の型をごっちゃに考えること自体、混乱の元のような気がしますが・・・。
x = ""
x ||= 1 # => ""
x = true
x ||= 1 # => true
このように、文字列型、整数型は、当然、1に置き換えません。本来保持している元の変数が、そのまま有効になります。
x = "aa"
x ||= 1 # => "aa"
x = 1
x ||= 1 # => 1
x = 0
x ||= 1 # => 0