Eigenclass & Singleton Method


Eigenclass & Singleton Method

class MyClass
  def my_method
    
  end
end

my = MyClass.new
my.my_method

 

 #调用实例方法my_method时,ruby会直接进入到类MyClass中,找到my_method方法

 #但是当定义一个单例方法,ruby是如何调用呢,单例方法存放在哪里?

 

 

def my.my_singleton_method
  
end

 

#单例方法不能存在于对象my中,因为my不是类

#单例方法不能存在于类MyClass中,如果存在于MyClass中,那么所有实例都会共享,也就不是单例方法了

#所以,也不能存在于MyClass的父类Object中

#那么单例方法到底存在哪里?

#答案是: 特性类eigenclass中

#一个对象有它自己的特殊的,隐藏起来的类,这个类就叫做对象的特征类

#ruby中可以通过class关键字,进入到特征类中

 

 

obj = Object.new
eigenclass = class << obj
  self
end

def obj.my_singleton_method
  
end

puts eigenclass.class
puts eigenclass.superclass
puts eigenclass.instance_methods.grep(/my_/)
#Class
#<Class:Object>
#my_singleton_method

 

#从上面的例子中可以看出,单例方法,是存在于特征类eigenclass中的


Eigenclass & Singleton Method

 

class C
  def a_method
    puts "C#a_method"
  end
end

class D < C
  
end

d = D.new
d.a_method

class Object
  def eigenclass
    class << self
      self
    end
  end
end

puts "abc".eigenclass

class << d
  def d_method
    puts 'D#d_method'
  end
end
puts d.eigenclass
puts d.eigenclass.superclass

 

 

#特征类:eigenclass是一个类,那么它肯定有父类,它的父类就是对象所属的类

#即:d的特征类的父类为D

#单例方法则存在于对象的特征类中

你可能感兴趣的:(method,eigenclass,singlton)