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でしのぐしかないかな。