Help us understand the problem. What is going on with this article?

Rubyの@_って何??

More than 1 year has passed since last update.

@_って何だろう...

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした