遅延初期化について
現在読んでる本で何回やっても読み方を忘れてしまう書き方があるのでまとめてみる。
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回しか呼び出されない