gotoshin

主に学んだ事の自分メモ用です。記事に書くまでも無いような事はhttps://scrapbox.io/study-diary/に書いてます。

遅延初期化について

現在読んでる本で何回やっても読み方を忘れてしまう書き方があるのでまとめてみる。

  private def current_staff_member
    if session[:staff_member_id]
      @current_staff_member ||=
        StaffMember.find_by(id: session[:staff_member_id])
    end
  end

これ遅延初期化というらしい。

ほぼ本からの引用だがあえて自分の言葉で書くと、

  • current_staff_memberメソッドが初めて呼ばれた時、インスタンス変数@current_staff_memberは空のため、演算子||右辺のStaffMember.find_by(id: session[:staff_member_id])が呼ばれる
  • current_staff_memberメソッドが2回目以降呼ばれた際は||の右辺は評価されない。つまり何も行われない。
  • 何がうれしいのかというと、 current_staff_memberメソッドを複数回呼び出した場合も、StaffMember.find_by(id: session[:staff_member_id])は最大1回しか呼び出されない

Ruby on Rails 6 実践ガイド - インプレスブックス