特異メソッド内のクラス(Ruby)

特異メソッド内のクラスは必ず Class クラスになります。

class A
  def self.print_class
    puts self          #=>A
    puts self.class    #=>Class
  end
  
  def print_class
    puts self          #=><A:0x007effb7e1e868>
    puts self.class    #=>A
  end
end

A.new.print_class
A.print_class

p A.instance_of?(Class)    #=>true

この結果を見ると、特異メソッドでは「インスタンスがクラスになっている」ということですね。わかるかな? 「Class クラスのインスタンスは(既存の)クラスである」と。

で、次の結果は有名(?)です。

p Class.instance_of?(Class)    #=>true

Class クラスはそのインスタンスとして自分自身を含んでいるわけです。再帰的?
Class クラスの祖先は次のとおりです。

p Class.ancestors    #=>[Class, Module, Object, Kernel, BasicObject]


話がちょっとズレますが、メソッド内のクラスを知るには、 self.class で与えられます。だから、トップレヴェルのメソッド内のクラスを知りたければ、

def a
  puts self          #=>main
  puts self.class    #=>Object
end

a

となって、Object クラスであることがわかります。ちなみに、この場合の self は main というやつですね。


※参考
class Class (Ruby 2.2.0)