2011/07/07

クラス変数は直感に反する(1.8)

Ruby1.8のクラス変数は継承されてしまうようです(1.9ではされないように変更)
一般的に(?)クラス変数という言葉から類推される挙動を求める場合は、クラスインスタンス変数を使います。「クラスのインスタンス変数」と「クラスインスタンス変数」は別物であることに注意。ややこしー。

逆にクラスインスタンス変数を使うと継承で初期化されないというデメリットがある。その場合は次のようにして初期化することができる。

class C
  @var = 1
  class << self
    attr_accessor :var

    def inherited(klass)
      klass.var ||= var
      super
    end
  end

  def disp
    self.class.var
  end
end

class D < C
end

p D.var # => 1
参考