Ruby 1.8とRuby 1.9でmodule_eval内でのクラス変数の扱いが違う

Ruby 1.8.6 (2007-03-13 patchlevel 0) [i686-darwin8.10.1]の場合

class Base
  @@hoge = 1
end

class Ex1 < Base
  @@piyo = 2
  def hogera
    @@hoge
  end
  def piyora
    @@piyo
  end
end
p @@piyo  #=> uninitialized class variable @@piyo in Object (NameError)

Ex2 = Class.new(Base) {
  @@piyo = 3
  def hogera
    @@hoge
  end
  def piyora
    @@piyo
  end
}
p @@piyo  #=> 3

Ex3 = Class.new {
  @@piyo = 4
}
p @@piyo  #=> 4

p Ex1.new.hogera  #=> 1
p Ex2.new.hogera  #=> uninitialized class variable @@hoge in Object (NameError)
p Ex1.new.piyora  #=> 2
p Ex2.new.piyora  #=> 4

Ruby 1.9.0 (2007-09-14 patchlevel 0) [i686-darwin8.10.1](2007/09/15 04:01:45のスナップショット)の場合

class Base
  @@hoge = 1
end

class Ex1 < Base
  @@piyo = 2
  def hogera
    @@hoge
  end
  def piyora
    @@piyo
  end
end
p @@piyo  #=> uninitialized class variable @@piyo in Object (NameError)

Ex2 = Class.new(Base) {
  @@piyo = 3
  def hogera
    @@hoge
  end
  def piyora
    @@piyo
  end
}
p @@piyo  #=> uninitialized class variable @@piyo in Object (NameError)

Ex3 = Class.new {
  @@piyo = 4
}
p @@piyo  #=> uninitialized class variable @@piyo in Object (NameError)

p Ex1.new.hogera  #=> 1
p Ex2.new.hogera  #=> 1
p Ex1.new.piyora  #=> 2
p Ex2.new.piyora  #=> 3

うーむ。後者が意図されたモノなんだろうなぁ。そっちの方が嬉しい。


でも1.8を切り捨てるわけにもいかず。こまった。どうする。

クラス変数の代わりにconst_setでしのぐしかないかな。