Ruby类元类中定义的self.m3方法:定义位置、访问方式及异常问题
关于Ruby中方法m3的定义与访问问题解析
咱们来一步步拆解你代码里的这个m3方法问题:
1. m3的定义情况
你这段代码里的class << A是打开了类A的元类(也叫单例类/ Singleton Class),但这里有个容易踩坑的细节:在这个元类的上下文里,self指向的是A的元类本身,而不是类A。你写的def self.m3相当于给A的元类添加了一个类方法,而不是直接给类A添加类方法。
2. 如何访问m3方法
因为m3是A的元类的类方法,所以得通过A的元类来调用它,常见的方式有两种:
- 直接获取A的元类后调用:
A.singleton_class.m3 - 在A的元类上下文里调用:
class << A self.m3 end
3. m3被定义在哪里?
方法m3最终被定义在类A的元类的元类中。简单梳理下逻辑:
- 类的类方法本质是它元类的实例方法;
- 而元类的类方法,就是元类的元类的实例方法。
所以你定义的self.m3是A的元类的类方法,也就存在于A的元类的元类里。
4. 为什么A.m3或Object类方法访问不到它?
- 对于
A.m3:类A的方法查找链里,只会找自身的实例方法、父类的实例方法,以及A的元类的实例方法(也就是A的类方法)。但m3是A的元类的类方法,不在这个查找链里,所以A找不到它。 - 对于Object的类方法:Object是A的父类,但Object的元类和A的元类的元类是完全不同的方法链分支,m3不在Object的方法查找路径中,自然也访问不到。
内容的提问来源于stack exchange,提问作者user1540918
相关产品推荐
相关产品推荐

