http://www.ruby-doc.org/core-2.1.5/Class.html
"类,模块和对象是相互关联的。在下图中,垂直箭头表示继承,括号元类。所有元类都是类Class
的实例。"
+---------+ +-...
| | |
BasicObject-----|-->(BasicObject)-------|-...
^ | ^ |
| | | |
Object---------|----->(Object)---------|-...
^ | ^ |
| | | |
+-------+ | +--------+ |
| | | | | |
| Module-|---------|--->(Module)-|-...
| ^ | | ^ |
| | | | | |
| Class-|---------|---->(Class)-|-...
| ^ | | ^ |
| +---+ | +----+
| |
obj--->OtherClass---------->(OtherClass)-----------...
什么是obj
?什么是OtherClass
?什么是水平箭头?什么可以在......的另一边?
"所有元类都是Class
的实例。"这是唯一一个东西是实例并且还从中继承的地方吗?
答案 0 :(得分:3)
什么是obj?
obj
是OtherClass
的一个实例。你可以通过调用
obj = OtherClass.new
什么是OtherClass?
OtherClass
是不在Class
,Module
,Object
和BasicObject
集合中的任何类。您可以通过编写
class OtherClass
end
虽然String
和Array
等核心库类也适用于此。
什么是横向箭头?
除了从obj
到OtherClass
的箭头外,每个水平箭头代表调用.singleton_class
的行为,它会返回一次性Class
对象,也称为元类
“......”的另一面可能是什么?
如果您注意到,图表右半部分的整个结构是通过调用.singleton_class
从图表的左半部分提取元类得出的。最右边的“...”表示同一模式的递归延续,即在元类本身上调用.singleton_class
,然后在元类的元类上调用.singleton_class
,依此类推。
所有元类都是Class的实例。元类是继承它的实例的唯一例子吗?
所有类都是Class
的实例同样如此。根据定义,任何类的任何实例都是它继承的实例。
奇怪的是,BasicObject
的元类是唯一的,因为没有其他对象的类和超类是相同的。其他一些有趣的自引用对象包括:
1)Object
类对象
Object.is_a?(Object)
# => true
Object.class.superclass.superclass
# => Object
2)Class
类对象
Class.is_a?(Class)
# => true
Class.class
# => Class
3)Module
类对象
Module.is_a?(Module)
# => true
Module.class.superclass
# => Module
4)BasicObject
类对象
BasicObject.is_a?(BasicObject)
# => true
BasicObject.class.superclass.superclass.superclass
# => BasicObject