Ruby对象模型 - 类的祖先

时间:2013-03-15 13:10:41

标签: ruby

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

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

1 个答案:

答案 0 :(得分:19)

班级AClass的一个实例,您可以通过A.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]

这个更具启发性:

BasicObject.ancestors
 => [BasicObject]

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