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