Ruby のクラスメソッド、特異クラスのインスタンス変数
Ruby Gold合格できました。感想と振り返り - 気軽に楽しくプログラムと遊ぶ
ここでちょっとオッと思ったのでメモ。
class MyClass @v = 1 def foo @v #=>nil end class << self @v = 2 # 特異クラスへのメソッド定義はクラスメソッド定義 def foo @v #=>1 end end end p MyClass.foo #=>1 p MyClass.new.foo #=>nil
こうなるわけですね。
ではと疑問に思うのだが、ここでの @v = 2
の値を取り出すことができるのか。この場所で p self
をやると #<Class:MyClass>
となるが、これの意味するところは、self のクラスは Class で、そのインスタンスが MyClass ということである。繰り返すが、これが self なわけだ。ということは、MyClass.singleton_class.instance_variable_get(:@v)
をすれば 2
を得ることができる。
ということは、
class MyClass class << singleton_class def foo @v end end end p MyClass.singleton_class.foo #=>2
で OK ですね!