从那篇博客文章中,你可以构建一个类似的图表:
+------------------+ +-------------------+
| Object |- eigenclass ->| Object eigenclass |
+------------------+ +-------------------+
^ ^
| superclass superclass |
+------------------+ +-------------------+
| A |- eigenclass ->| A eigenclass |
+------------------+ +-------------------+
^
| superclass
+-------+ +------------------+
| A.new |- eigenclass ->| A.new.eigenclass |
+-------+ +------------------+
尝试查找实例的元类的超类,显示其指向
A
类。
A.new.eigenclass.superclass
Class.new
会返回一个Class对象的实例,即一个新类。它就像A
类一样也是一个类。
Class.new.class
A.class
A类和Class.new类的超类都是隐式的
Object
。
Class.new.superclass
A.superclass
因为A的超类是
Object
,所以A的特殊类(eigenclass)的超类是Object的特殊类。
Object.eigenclass
A.eigenclass.superclass
A.eigenclass.superclass == Object.eigenclass
同样地,找到
Class.new
的元类的超类将得到Object的元类。
Class.new.eigenclass.superclass
Class.new
和 A.new
的区别在于,Class.new
是一个类,因此可以构造新的对象,而 A.new
不行。
Class.new.new # => #<#<Class:0x007f86b50d8f70>:0x007f86b50d8f20>
A.new.new # => NoMethodError: undefined method `new' for #<A:0x007f86b50cbf50>