Ruby对象模型 - 类的祖先

wmo*_*ock 20 ruby

我正在从"Metaprogramming Ruby"这本书中学习Ruby对象模型,我也理解了类如何成为对象的概念.

class A
end

A.ancestors # => [A, Object, Kernel, BasicObject]
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

令我困惑的是,当我最初在irb中尝试A.ancestors时,我期待我在A.class.ancestors中得到的结果 - 我的思考过程是:因为A是一个类,而一个类是一个实例class Class,它的祖先是Class.但是Class似乎不是A的祖先.

有人能在这里解决我的困惑吗?

Nei*_*ter 20

该类A是一个实例Class,你可以看到viaA.class

A的实例的类是A,您可以通过它访问它a = A.new; a.class

该方法ancestors显示了该类的对象具有(或将具有)作为其继承的类层次结构.

在您的示例中有两个并行的类层次结构模型,它们只相互影响,因为Ruby将其类作为对象进行检查和修改.

没有任何根本原因需要A.class.ancestors和A.ancestors相交 - 除了Ruby也有一个简单根的深层模型,所以在实践中你会看到.

事实上,我找不到任何反例,即使是这样做:

NilClass.ancestors
 => [NilClass, Object, Kernel, BasicObject]

NilClass.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)

这个更具启发性:

BasicObject.ancestors
 => [BasicObject]

BasicObject.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)