トップレベルでクラス変数を定義すると・・

トップレベルでクラス変数を使うというのは、《やってはいけないこと》なのでruby-dev にも言わないことにしたが・・

上位クラスでクラス変数を使った場合、というテーマではあり得るかな。

それはさておき、トップレベルでクラス変数を定義した後に下位のクラスの定義で同じ名前のクラス変数があると《共有》されてしまうようだ。

下位クラスの定義の時点で上位クラスに同じ名前のクラス変数がなければ、ローカルなスコープでのクラス変数を新たに定義するようだ。

変な仕様だが、ブロックの片面的スコープと同じ仕組みなのだろう。

ruby1.8 での実験だが、ruby1.9 ではどうなっているのだろうか?

#!ruby -Ks

@@foo = :top_level
p @@foo             #=> :top_level

class Foo
  p defined? @@foo  #=> "class variable"
  @@foo = :foo      # すでに上位クラスで定義されていれば、それの書き換え。ブロックと同じ仕組み。
  def foo
    p @@foo
  end
end

p @@foo             #=> :foo
Foo.new.foo         #=> :foo
@@foo = :top_level2
Foo.new.foo         #=> :top_level2
#!ruby -Ks

class Foo
  p defined? @@foo  #=> nil
  @@foo = :foo      # 上位クラスで定義されていなければ、ローカルな定義。
  def foo
    p @@foo
  end
end

@@foo = :top_level
p @@foo             #=> :top_level
Foo.new.foo         #=> :foo
p @@foo             #=> :top_level
@@foo = :top_level2
Foo.new.foo         #=> :foo