特異クラスにも定義できるのかな?と思ったのでやったことメモです。
動作環境
Ruby 2.3.1
OS X El Capitan 10.11.6
やったこと
まず、クラスメソッドを定義する方法で定義してみました。
class C
class << self
@@val = 100
end
end
C.singleton_class.class_variables #=> []
C.class_variables #=> [:@@val]
むむ、なんかうまくいかない。。。
なんでこれがうまく行くと思ったかというと、クラスインスタンス変数は思った通りの動きをしているからなんです。
class D
@val = 20 # クラスDのクラスインスタンス変数
class << self
@val = 10 # 特異クラスのクラスインスタンス変数
def get_val
@val
end
end
end
p D.get_val #=> 20
p D.singleton_class.instance_variable_get(:@val) #=> 10
クラス変数については、どうやらここを参考にしますと
クラス変数のスコープはレキシカルスコープに従うとこのこと
つまり、この場合でいうとD
にあるように振る舞うということになります。
なので、トップレベルで似たようなことをすると・・・
class E
end
class << E
@@val = 100 # warning: class variable access from toplevel
end
ワーニングでましたね
ひとまず、class_variable_set
を使うしか方法はないのかな?と思っています。
class D
end
D.singleton_class.class_variable_set(:@@val, 100)
p D.singleton_class.class_variable_get(:@@val)