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 ですね!