Ruby类/对象/模块图说明
类、模块和对象是相互关联的。在下面的图表中,垂直箭头表示继承,括号表示元类。所有元类都是类的实例 什么是obj?什么是Ruby类/对象/模块图说明,ruby,oop,Ruby,Oop,类、模块和对象是相互关联的。在下面的图表中,垂直箭头表示继承,括号表示元类。所有元类都是类的实例 什么是obj?什么是OtherClass?什么是水平箭头?在…的另一边可能是什么 “所有元类都是类的实例”“这是唯一一个地方,在这里,某个东西既是一个实例,又是从中继承的?什么是obj? obj是OtherClass的一个实例。你可以打电话来 obj = OtherClass.new 什么是其他类? 其他类是不在类、模块、对象和基本对象集合中的任何类。您可以通过编写 class OtherClas
OtherClass
?什么是水平箭头?在…的另一边可能是什么
“所有元类都是
类的实例”
“这是唯一一个地方,在这里,某个东西既是一个实例,又是从中继承的?什么是obj?
obj
是OtherClass
的一个实例。你可以打电话来
obj = OtherClass.new
什么是其他类?
其他类
是不在类
、模块
、对象
和基本对象
集合中的任何类。您可以通过编写
class OtherClass
end
尽管核心库类,如String
和Array
也适合这里
什么是水平箭头?
除了从obj
到OtherClass
的箭头外,每个水平箭头都表示调用.singleton\u class
的行为,该行为返回一个一次性的class
对象,也称为元类
在“…”的另一边可能是什么?
如果您注意到,图表右半部分的整个结构是通过调用.singleton_class
从图表左半部分提取元类而派生的。最右边的“…”表示相同模式的递归延续,即对元类本身调用.singleton\u class
,然后对元类的元类调用.singleton\u class
,依此类推
所有元类都是类的实例。元类是它继承的唯一实例吗?
同样正确的是,所有类都是Class
的实例。根据定义,任何类的任何实例都是其继承自的实例
奇怪的是,BasicObject
的元类是唯一的,因为没有其他对象的类和超类是相同的。其他一些有趣的自参考对象包括:
1) 对象
类对象
Object.is_a?(Object)
# => true
Object.class.superclass.superclass
# => Object
Class.is_a?(Class)
# => true
Class.class
# => Class
Module.is_a?(Module)
# => true
Module.class.superclass
# => Module
BasicObject.is_a?(BasicObject)
# => true
BasicObject.class.superclass.superclass.superclass
# => BasicObject
2) Class
Class对象
Object.is_a?(Object)
# => true
Object.class.superclass.superclass
# => Object
Class.is_a?(Class)
# => true
Class.class
# => Class
Module.is_a?(Module)
# => true
Module.class.superclass
# => Module
BasicObject.is_a?(BasicObject)
# => true
BasicObject.class.superclass.superclass.superclass
# => BasicObject
3) 模块
类对象
Object.is_a?(Object)
# => true
Object.class.superclass.superclass
# => Object
Class.is_a?(Class)
# => true
Class.class
# => Class
Module.is_a?(Module)
# => true
Module.class.superclass
# => Module
BasicObject.is_a?(BasicObject)
# => true
BasicObject.class.superclass.superclass.superclass
# => BasicObject
4) BasicObject
类对象
Object.is_a?(Object)
# => true
Object.class.superclass.superclass
# => Object
Class.is_a?(Class)
# => true
Class.class
# => Class
Module.is_a?(Module)
# => true
Module.class.superclass
# => Module
BasicObject.is_a?(BasicObject)
# => true
BasicObject.class.superclass.superclass.superclass
# => BasicObject
哎呀。修复了链接。