クラスインスタンス変数とスコープ
気になったので、調べてみた
module Hoge module Moge class Test # クラスインスタンス変数 @hoge= ->{ p 'called!!'; 'aaaa'}.call # 特異メソッド def self.get p @hoge end # インスタンスメソッド def get p @hoge end end end end # クラスメソッドはクラスのインスタンス変数を見ることができる。 # 最初に読み込まれたタイミングで初期化がはしる Hoge::Moge::Test.get #=> called!! #=> aaaa # インスタンスメソッドはクラスインスタンス変数を見ることができない。 Hoge::Moge::Test.new.get #=> nil # クラスインスタンス変数の初期化は # 最初に読み込まれたタイミングの一度のみしか走らないようです。 Hoge::Moge::Test.get #=> aaaa
下記のようにクラス変数にするとどのメソッドからでも参照できます。
module Hoge module Moge class Test # クラスインスタンス変数 @@hoge= ->{ p 'called!!'; 'aaaa'}.call # 特異メソッド def self.get p @@hoge end # インスタンスメソッド def get p @@hoge end end end end # クラスメソッドはクラス変数を見ることができる。 Hoge::Moge::Test.get #=> called!! #=> aaaa # インスタンスメソッドはクラス変数を見ることができる。 Hoge::Moge::Test.new.get #=> aaaa