Ruby对象模型 - 类的祖先

21

我正在从书籍《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似乎不是A的祖先。


2
AClass 的一个实例,在 Ruby 中,Class 也是一个实例,我的英语不好 =( - Steely Wing
1个回答

24

AClass 的一个实例,您可以通过 A.class 查看。

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

ancestors 方法显示了该类对象(或者将要)继承的类层次结构。

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

没有必要让 A.class.ancestorsA.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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接