Rubyスクリプトで目にする以下のイディオムは、左辺が未定義または偽なら右辺の値を代入するという意味だ。このイディオムは変数の初期化で良く用いられる。
a ||= true
このイディオムを自己代入演算子を省略せず書くと以下と同じ意味である。
a || (a = true)
通常、a op= b(opは+などの演算子)のような自己代入演算子はa = a op bと同義だが、||と&&だけは例外で、a op (a = b)の扱いとなる。 よって、このイディオムは以下とは意味が異なることには注意が必要だ。
a = a || b
||とorは同じであり、orのリファレンスを読むと次の説明がある。
まず左辺を評価して、結果が偽であった場合には右辺も評価します。 or は同じ働きをする優先順位の低い演算子です。
これで||=のイディオムの意味は完全に理解できる。 はじめから繰り返すと、
a ||= true
は
a || (a = true)
であり、||は、左辺をまず評価して、結果が真なら何もせず、偽なら右辺の変数aへの代入を評価する。よって、このイディオムはaが未定義または偽なら右辺の値を代入する、という意味になるのだ。
