Rubyのクラス変数

クラス変数は@@を使って定義する。インスタンス変数と違って初期化されていないとエラーになるので嫌な感じ。

class Hoge
    def self.hoge= v
        @@hoge = v
    end
    def self.hoge
        @@hoge
    end
end
 
Hoge.hoge = "ほげ"
p Hoge.hoge

@@を使わずにクラスに特異メソッドをくっつけてクラス変数とすることもできるようだ。

class Hoge
   class << self
      attr_accessor(:hoge)
   end
end
 
Hoge.hoge = "ほげ"
p Hoge.hoge

こちらは初期化されていなくてもエラーにならないが、@@で定義した変数とは無関係で@@hogeは未定義の変数になる。

おそらく前者はクラスに属している本当のクラス変数だが、後者はHogeクラスというインスタンスのhogeというフィールド、クラスインスタンスインスタンス変数なのだろう。