クラス変数はサブクラスでも共通

クラス変数の内容を出力する簡単なソース。
なんだけど、実行結果は不思議な結果に。

class BaseHoge
cattr_accessor :hoge
@@hoge = 1
puts self.hoge
end

class DHoge1 < BaseHoge
@@hoge = 3
end

class DHoge2 < BaseHoge
puts self.hoge
end

自分が期待していたDHoge2のクラス変数hogeの出力結果は1だった。
だけど、実際には3だった。
継承したクラスでクラス変数を上書きすると親クラスのクラス変数まで変わってしまうということだろうか?

とりあえず、こんな事をして見るもよく分からず。

puts [BaseHoge.class, DHoge1.class,DHoge2.class].join(",")
puts BaseHoge == DHoge2
puts BaseHoge === DHoge2

なんか調べ方が根本的に間違ってる気がする。
と困ってググって見るとMartin先生のBlogが引っかかった。
http://capsctrl.que.jp/kdmsnr/wiki/bliki/?ClassInstanceVariable

クラス変数はクラスのインスタンスで共有されるからだ。この場合、サブクラスも含まれる。つまり、クラスは2つあるが、クラス変数は1つなのだ。

おおっと。
1.9では解決…と言うか仕様変更される模様。
Railsだとクラス変数を使うことは結構多いから、結構困る事が出てくる気がするなぁ。


追記(ちょっと思った事)

Rubyだと継承を明記しなかった場合には自動的にObjectクラスを継承する事になる。
と言うことは、すべてのクラスはObjectクラスに通ず、と言うわけで…。するとクラス変数は、と言うかクラスのインスタンスは一つしかない、みたいな事になる気がするけど実際はそんな事はないんだろうな。