我正在从"Metaprogramming Ruby"这本书中学习Ruby对象模型,我也理解了类如何成为对象的概念.
class A
end
A.ancestors # => [A, Object, Kernel, BasicObject]
A.class.ancestors # => [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,当我最初在irb中尝试A.ancestors时,我期待我在A.class.ancestors中得到的结果 - 我的思考过程是:因为A是一个类,而一个类是一个实例class Class,它的祖先是Class.但是Class似乎不是A的祖先.
有人能在这里解决我的困惑吗?
Nei*_*ter 20
该类A是一个实例Class,你可以看到viaA.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]
Run Code Online (Sandbox Code Playgroud)
这个更具启发性:
BasicObject.ancestors
=> [BasicObject]
BasicObject.class.ancestors
=> [Class, Module, Object, Kernel, BasicObject]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9850 次 |
| 最近记录: |