为什么Class是Class的实例,而不是Object的实例?
Class.instance_of?(Object)
返回false
,而Class.instance_of?(Class)
返回true
。 我觉得这很令人惊讶,因为我认为作为对象的Class
必须是Object
类的一个实例。 它怎么可能是它自己的一个实例?
但假设Class
是Object
类的一个实例,似乎会导致更加混乱的问题; 因为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等。