コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

「初回は生成処理、それ以降は生成処理の結果を返す」のような記述をRubyで簡便に行う

「毎度計算して求めたくないんだよね」というニーズに答える書き方。前書いた原理の逆引き的な応用編。

環境

書き方

||= を使うことで二回目以降の実行を抑止できる

めちゃくちゃ重い処理 heavy_work があったとして、それを一回だけ実行して、それ以降は行いたくない場合、以下のようにクラスを作る。

class DemoObject
  def create_var
    @view_param ||= heavy_work
  end

  private

  # 一回だけやりたい作業
  # @return [String] 作業の結果
  def heavy_work
    p "Heavy Work Start!"
    # なにかめちゃくちゃ重たい処理
    p "Heavy Work Complete!"
    "Work Result"
  end
end

インスタンスメソッドに持つことによって、二回目以降は行われない 以下のようなプログラムを動かすと…

demo_obj = DemoObject.new
p demo_obj.create_var
p demo_obj.create_var

下記のような結果になる

$ ruby test.rb
"Heavy Work Start!"
"Heavy Work Complete!"
"Work Result"
"Work Result"

原理

原理は昔書いたのでそれを参考のこと

Rubyで初期値設定を行うときは || を使って nil 判定をする自己代入式を使うと便利 - コード日進月歩