我正在从“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的祖先。
有人能在这里解决我的困惑吗?
答案 0 :(得分:19)
班级A
是Class
的一个实例,您可以通过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]