我正在学习“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的祖先。
有人能在这里消除我的困惑吗?
最佳答案
类 A
是 Class
的实例,您可以通过 A.class
看到它
A 实例的类是 A
,您可以通过 a = A.new; 访问它; a.类
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]
关于Ruby 对象模型 - 一个类的祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15433378/