tawara's blog

雑記。個人の見解です。

hoge ll= foo はhogeがnilまたはfalseなら、fooをhogeに代入する

こんにちは、たわらです。

本記事は演算子||=について整理した記事です。

事例 nilだったら空文字入れたい

ある変数がnilだった場合に、空文字を代入したいことがありました。ない知恵を絞ってこんなコードを書きました。

if sentence.body.nil?
 sentence.body = ''
else
 sentence.body
end

なんだか冗長な感じを受けます。

自己代入を使おう

このコードは自己代入を使うとすっきりと書くことができます。

sentence.body ||= ''

これは、下記のコードを省略したものです。

sentence.body = sentence.body || ''

右辺に注目します。ll演算子は式全体の真偽値が確定した時点で式の評価を終わらせ、そのときの戻り値を返します。

つまり、sentence.bodyがfalseでもnilでもない真の値であれば、sentence.body = sentence.bodyとなります。一方で、sentence.bodyがfalseかnilの場合、sentence.body = ''となります。

Rubyのレファレンスには、

a ||= 1         # a が偽か未定義ならば1を代入。初期化時のイディオムの一種。

と説明されています。初期化時に使うことが多いようです。なるほど。

また、チュリー本には、

X ||=A というコードを見たら「変数Xがnilまたはfalseなら、AをXに代入」と頭の中で読み替えるようにしてください

とまで書いてあります(pp174)。

論理演算子は慣れないと、ぎょっと体が固まってしまいます。早く慣れたいものです。

参考文献

docs.ruby-lang.org

amzn.to