クラス変数はサブクラスでも共通
クラス変数の内容を出力する簡単なソース。
なんだけど、実行結果は不思議な結果に。
class BaseHoge
cattr_accessor :hoge
@@hoge = 1
puts self.hoge
endclass DHoge1 < BaseHoge
@@hoge = 3
endclass 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だとクラス変数を使うことは結構多いから、結構困る事が出てくる気がするなぁ。