21

我正在研究“Metaprogramming Ruby”一书中的 Ruby 对象模型,并且我也理解类是对象的概念。

class A
end

A.ancestors # => [A, Object, Kernel, BasicObject]
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]

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

有人可以在这里消除我的困惑吗?

4

1 回答 1

23

该类A是 的一个实例Class,您可以通过A.class

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

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

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

根本没有理由需要 A.class.ancestors 和 A.ancestors 相交——除了 Ruby 也有一个具有简单根的深层类模型,所以在实践中这就是您将看到的。

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

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

NilClass.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]

不过,这个更有启发性:

BasicObject.ancestors
 => [BasicObject]

BasicObject.class.ancestors
 => [Class, Module, Object, Kernel, BasicObject]
于 2013-03-15T13:23:42.767 回答