首先,让我们添加一个方法来检索“从
this blog post复制”的特征类
class Object def eigenclass class << self self end end end
然后创建一个简单的类
class A end puts A.new.eigenclass.superclass # => A puts Class.new.eigenclass.superclass # => #<Class:Object>
我期待第二次投入输出Class
任何线索为什么会这样?
解决方法
从该博文中,您可以构建一个类似的图表:
+------------------+ +-------------------+ | Object |- eigenclass ->| Object eigenclass | +------------------+ +-------------------+ ^ ^ | superclass superclass | +------------------+ +-------------------+ | A |- eigenclass ->| A eigenclass | +------------------+ +-------------------+ ^ | superclass +-------+ +------------------+ | A.new |- eigenclass ->| A.new.eigenclass | +-------+ +------------------+
试图找到A实例的本征类的超类表明它指向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的本征类的超类是Object的特征类.
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>