@_って何だろう...
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