LoginSignup
14
5

More than 5 years have passed since last update.

Rubyの@_って何??

Posted at

@_って何だろう...

gem等を読んでると、 @_ を時々見るけど、@とは違うのかな?
と思い、調べてみました。

    def config
      @_config ||= Config.new
    end

調査して来た

ごく普通のインスタンス変数っぽい

  • @_hogeはただのインスタンス変数
  • @hogeでない理由はある命名規則に則っているからぽい

ある命名規則とは??

  • 直接、このインスタンス変数を参照しないで欲しい!場合の規則

どういう時に、インスタンス変数を参照しないで欲しい!となる?

  • インスタンス変数を、ローカルキャッシュとして扱う場合!!

具体例

ローカルキャッシュとして扱いたい

def notes
  @notes ||= Note.all
end

notesを実行すれば、Noteのデータを全て@notesに保持しておくことが出来、
@notesに何もない場合は、Note.allから取ってくることが出来る。

こういうのをローカルキャッシュという。

こういう場合は、notesで一貫して取って来て欲しいとなる。
つまり、他の箇所で、@notesNote.allを使うより、notesを使って欲しい。

そうすれば、無駄にメソッドを実行することも無いし、何も無い場合は取得してくるように出来る。

# こうじゃなく...
# @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 になる!

@_の正体は、こ、これか!!

# @_notesは直接使わないで欲しいんだった!
# となりそう!
def p_notes
  p notes
end

private

def notes
  @_notes ||= Note.all
end

参考

14
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
5