🚴

【Ruby】||=や&&= の意味とユースケース

2023/11/17に公開

プロダクトのコードを読んでいるとたまに見かける||=や&&=について、
久しぶりに見るとなんだっけ?と忘れてしまうのでまとめた。

||= や &&= の意味

自己代入と呼ばれる演算式。
リファレンスはこちら。
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#selfassign
+=とか*=と同じ位置付けなのかな?

# 以下は同義
a ||= b
a || a = b
# aがtrue、もしくは値が定義されていれば、aを返す。
# aがfalse、もしくはnilであれば、aにbを代入する。

# 同義2
a &&= b
a && a = b
# aがtrue、もしくは値が定義されていれば、aにbを代入する。
# aがfalse、もしくはnilであれば、aの値を返す。

用途

意味は分かったけど、どういうケースで使うの?の具体例を記す。
||=は、変数に値が入っていないときだけ、DBから値を取ってきて代入したい時に使えそうだな〜、
というイメージは湧く。こちらの超ありがたい伊藤様の記事でユースケースがまとめられている。
https://qiita.com/jnchito/items/dedb3b889ab226933ccf#nilだったら初期化の代わりに--を使う

ただ、&&=は全然イメージが湧かなかったので調べてみた。
こちらの記事でユースケースが紹介されていた。
https://qiita.com/umanoda/items/a8e37b2aff77bbd0a413

タイトルを英語にすると and and && and &&= という訳のわからないことになります。日本語って便利ですね。

良い導入文。好きです。笑
で、どう使うかというとこんな感じ。

def test
  succes = true
  success &&= method_a(arg[:a]) if params[:a]
  success &&= method_b(arg[:b]) if params[:b]
  success
end

# 書き直すと(読みにくくなってる気もするけど)
def test
  success = true
  success && success = method_a(params[:a]) if params[:a] #(1)
  success && success = method_b(params[:b]) if params[:b] #(2)
  success
end

params[:a]に値が入っていればmethod_aを実行する。
method_aの結果がtrueならmethod_bは実行せず、testメソッドはfalseを返す。
method_aがtrueなら、(2)の処理に進み、
params[:b]に値が入っていればmethod_bを実行する。
methodの結果をtestメソッドの返り値として返す。

ぱっと見、successっていう変数を使う意味ある?って思ったけど
良い感じ仲介役してくれてる。

そういえばプロダクトのコードで見かけたことがあるかも。
覚えておきたい。

Discussion