_J Blog

学んだ事のまとめやメモなどが中心です

クラスインスタンス変数とスコープ

気になったので、調べてみた

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