@_って何だろう...
gem等を読んでると、 @_ を時々見るけど、@とは違うのかな?
と思い、調べてみました。
.rb
def config
@_config ||= Config.new
end
調査して来た
ごく普通のインスタンス変数っぽい
-
@_hogeはただのインスタンス変数 -
@hogeでない理由はある命名規則に則っているからぽい
ある命名規則とは??
- 直接、このインスタンス変数を参照しないで欲しい!場合の規則
どういう時に、インスタンス変数を参照しないで欲しい!となる?
- インスタンス変数を、ローカルキャッシュとして扱う場合!!
具体例
ローカルキャッシュとして扱いたい
.rb
def notes
@notes ||= Note.all
end
notesを実行すれば、Noteのデータを全て@notesに保持しておくことが出来、
@notesに何もない場合は、Note.allから取ってくることが出来る。
こういうのをローカルキャッシュという。
こういう場合は、notesで一貫して取って来て欲しいとなる。
つまり、他の箇所で、@notesやNote.allを使うより、notesを使って欲しい。
そうすれば、無駄にメソッドを実行することも無いし、何も無い場合は取得してくるように出来る。
.rb
# こうじゃなく...
# @notesに何も無い場合は、nilになってしまう
def p_notes
p @notes
end
# こうでもなく...
# 無駄にメソッドを実行してしまう
def p_notes
p Note.all
end
# こう!
# @notesに何もなければ、Note.allで取得するし
# @notesに値がある場合は、その値を使ってくれる
def p_notes
p notes
end
private
def notes
@notes ||= Note.all
end
しかし、開発者たちはその意図が分かるだろうか??
毎回これは notesを使ってねと言わなければいけないのだろうか?
直接使って欲しくない場合は、_を前に付ける
どうやら、Rubyを含む多くの言語にて、直接使って欲しくないような変数には、
_をプレフィックスとして付ける慣習があるみたいだ。
ということで、先ほどの@notesに_を付けてみると...??
@_notes になる!
@_の正体は、こ、これか!!
.rb
# @_notesは直接使わないで欲しいんだった!
# となりそう!
def p_notes
p notes
end
private
def notes
@_notes ||= Note.all
end