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

时间:2015-12-28 18:14:06

标签: ruby class object

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

但假设ClassObject类的一个实例,似乎会导致更加混乱的问题;由于Object是一个类,因此它必须是Class类的实例。这是怎么回事?

3 个答案:

答案 0 :(得分:2)

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

的实例

因此,您定义的每个课程都会为您提供:

  > MyClass.instance_of?(Class)
  => true

在此页面上查看包含继承的图表:http://ruby-doc.org/core-2.2.3/Class.html

类,模块和对象是相互关联的。在下图中,垂直箭头表示继承,括号表示元类。所有元类都是“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的截屏系列: The Ruby Object Model and Metaprogramming

答案 1 :(得分:1)

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中的类是一个对象。

答案 2 :(得分:0)

作为自身实例的类

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

  

Class是Class的一个实例。

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

类作为Object的一种实例

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

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

现在让我们考虑一下Object。 Object是一个类,所有类都是Class的实例。因此,Object是类Class的实例。

首先是哪个?对象还是类?

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