为什么Class是Class的实例,而不是Object的实例?

Class.instance_of?(Object)返回false ,而Class.instance_of?(Class)返回true 。 我觉得这很令人惊讶,因为我认为作为对象的Class必须是Object类的一个实例。 它怎么可能是它自己的一个实例?

但假设ClassObject类的一个实例,似乎会导致更加混乱的问题; 因为Object是一个类,所以它必须是Class类的一个实例。 这里发生了什么?

Ruby中的类是第一类对象:每个类都是类Class的实例

所以你定义的每个类都会给你:

  > MyClass.instance_of?(Class) => true 

查看本页inheritance的图表: http : //ruby-doc.org/core-2.2.3/Class.html

类,模块和对象是相互关联的。 在下图中,垂直箭头表示inheritance,括号表示元类。 所有元类都是类“Class”的实例。

  +---------+ +-... | | | BasicObject-----|-->(BasicObject)-------|-... ^ | ^ | | | | | Object---------|----->(Object)---------|-... ^ | ^ | | | | | +-------+ | +--------+ | | | | | | | | Module-|---------|--->(Module)-|-... | ^ | | ^ | | | | | | | | Class-|---------|---->(Class)-|-... | ^ | | ^ | | +---+ | +----+ | | obj--->OtherClass---------->(OtherClass)-----------... 

这意味着:

  > Class.ancestors => [Class, Module, Object, Kernel, BasicObject] > Class.superclass => Module > Module.superclass => Object > Object.superclass => BasicObject > BasicObject.superclass => nil 

为了更深入地了解这一点,我强烈推荐Dave Thomas的截屏系列: Ruby对象模型和元编程

 BasicObject.superclass # => nil Object.superclass # => BasicObject String.superclass # => Object Class.superclass # => Module Module.superclass # => Object Class.ancestors # => [Class, Module, Object, Kernel, BasicObject] 

正如您所看到的, Class是一个模块,当您创建任何类时,您正在创建Module的对象。 Class.ancestors返回所有对象的祖先。 因为Ruby中的类是一个对象。

类作为自身的实例

Class是一个特殊的类,它可以创建新的类。 现在,由于Class本身是一个类,它只能由Class创建,这就是Ruby定义它的方式。 你拿走了:

Class是Class的一个实例。

但是,如果不存在,Class如何创建自己呢? 那是个很好的观点。 我想说它只是把它想象成一个创造了自己的特殊实体。


类作为Object的一种实例

Class也是Object的子类。 所以Class的所有实例都只是Object的专用实例。 换句话说,Class的实例是Object的实例加上类Class的所有权力。

使用这种思想并按照前面的定义:Class是Class的一个实例。 因此Class是Object的专用实例。

我们现在考虑对象。 Object是一个类,所有类都是Class的实例。 接下来,Object是类Class的一个实例。


那先来了? 对象还是类?

Object是一个类,因此Class必须首先存在才能创建Object。 但Class是Object的子类,因此Object必须首先存在。 那是哪个呢? 只需接受它作为循环定义,即Object需要Class,但Class需要Object,但Object需要Class等。