从那篇博文中,您可以构建一个类似的图表:
+------------------+ +-------------------+
| Object |- eigenclass ->| Object eigenclass |
+------------------+ +-------------------+
^ ^
| superclass superclass |
+------------------+ +-------------------+
| A |- eigenclass ->| A eigenclass |
+------------------+ +-------------------+
^
| superclass
+-------+ +------------------+
| A.new |- eigenclass ->| A.new.eigenclass |
+-------+ +------------------+
试图找到 A 实例的 eigenclass 的超类表明它指向 A 类。
A.new.eigenclass.superclass # => A
Class.new 返回一个 Class 对象的实例,即一个新类。它是一个类,就像A 类一样。
Class.new.class # => Class
A.class # => Class
A 的超类和 Class.new 的超类都隐含为Object。
Class.new.superclass # => Object
A.superclass # => Object
因为 A 的超类是 Object,所以 A 的 eigenclass 的超类是 Object 的 eigenclass。
Object.eigenclass # => #<Class:Object>
A.eigenclass.superclass # => #<Class:Object>
A.eigenclass.superclass == Object.eigenclass # => true
类似地,找到Class.new 的特征类的超类会产生 Object 的特征类
Class.new.eigenclass.superclass # => #<Class:Object>
Class.new 和A.new 的区别在于Class.new 本身是一个类,因此可以构造新对象,而A.new 不能。
Class.new.new # => #<#<Class:0x007f86b50d8f70>:0x007f86b50d8f20>
A.new.new # => NoMethodError: undefined method `new' for #<A:0x007f86b50cbf50>