【问题标题】:Why is Class an instance of Class, and not of Object? [duplicate]为什么 Class 是 Class 的实例,而不是 Object 的实例? [复制]
【发布时间】:2016-04-02 14:25:56
【问题描述】:

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

但是假设ClassObject 类的一个实例似乎会导致一个更令人困惑的问题;因为Object 是一个类,它必须是Class 类的一个实例。这是怎么回事?

【问题讨论】:

标签: ruby class object


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 中的类是一个对象。

    【讨论】:

      【解决方案3】:

      类作为自身的实例

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

      Class 是 Class 的一个实例。

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


      类作为 Object 的一种实例

      Class 也是 Object 的子类。所以 Class 的所有实例实际上只是 Object 的特殊实例。换句话说,Class 的实例是 Object 的实例加上 Class Class 的所有权力。

      使用这种思想并如前所述:Class 是 Class 的一个实例。因此 Class 是 Object 的一个特殊实例。

      现在让我们考虑对象。 Object 是一个类,所有的类都是 Class 的实例。由此可见,Object 是 Class 类的一个实例。


      那么哪个先出现?对象还是类?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 2015-02-23
        • 2011-11-24
        • 2022-07-21
        • 2016-10-02
        相关资源
        最近更新 更多