ボクココ

個人開発に関するテックブログ

Ruby ソースリーディング -attr_accessor の罠-

今、Doorkeeper のソースを読んでOAuth の仕組みの勉強をしている。
その中で、途中いきなりローカル変数っぽいのが登場して、これがどこから呼ばれてるのかわからなくなるときがある。
メソッド内で登場するローカル変数っぽいのを見つけた場合、以下の3つのどれかかかな?たぶん
・ クラス内のプライベートメソッドなど
・ attr_accessor 等のクラスメソッド内で動的に定義されたメソッド
・ どっか上の階層で何かしらのrequire していて コード全体で呼び出せるメソッドを定義してる

attr_accessor のコード例


class Token
attr_accessor :access_token

def authorize
issue_token
TokenResponse.new access_token
end

private
def issue_token
@access_token = AccessToken::create!()
end

大事な部分だけ抜粋すると、こんな感じのコードだった。
最初、authorizeメソッドだけを見ると、issue_tokenで@access_tokenに値が代入されてるのはわかるけど、次のaccess_tokenっていうローカル変数 or メソッドがどこにも出てこね!って思っていろいろ検索してしまった。
よくよく見ると、上の方にattr_accessorがあった。
それでも個人的にはattr_accessorって@access_tokenみたいにしないとあくせすできないんじゃないの、と思ってたんだが、そこが勘違い。
attr_accessor は内部で以下のようなメソッドを作っているという認識があればこの勘違いはなかった。。

def access_token
@access_token
end
つまり、インスタンス変数の @access_tokenに代入さえすれば、access_tokenはローカル内のメソッドとして呼び出しが可能となるのか。

当たり前っちゃ当たり前だけど、ソースを読む上で意外と見落としがちなので注意しよう。