注:上图缺失了几条线,那些eigenclass.class为Class类,下面以MyClass为例
eigenclass = class << MyClass
self #进入了MyClass的eigenclass中
end
eigenclass.class #==> Class
其实Class类与Module类的Methods是一样的,而Class.new(也就是你定义的类)与Module.new(也就是你定义的module)的methods就差了:allocate, :new, :superclass这三个方法,所以定义的Module(如Kernel)不能实例化,也不存在超类
Class.methods - Module.methods #==> []
Class.new.methods - Module.new.methods #==> [:allocate, :new, :superclass]
你定义类的类方法其实都在eigenclass中
class MyClass
class << self #打开了MyClass的eigenclass,定义的方法为Myclass的类方法
def x1;end #x1,x2为Myclass的类方法
def x2;end
end
end
obj = Mycalss.new
class << obj #打开obj对象的eigenclass,定义的方法是obj对象的单件类方法
def x3; p "I am x3"; end
end
obj.x3 #==> "I am x3"