Hello Ruby(Ruby元 一)

730 查看

注:上图缺失了几条线,那些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"