在Ruby中,是先有类还是BasicObject?

4
乍一看,我以为BasicObject只是“放置”了Class(即Class继承自BasicObject)。
Class.ancestors #=> [Class, Module, Object, Kernel, BasicObject]
Module.ancestors #=> [Module, Object, Kernel, BasicObject]
Object.ancestors #=> [Object, Kernel, BasicObject]
BasicObject.ancestors #=>[BasicObject] 

但是事情突然变得非常奇怪。
Class.class #=> Class
Module.class #=> Class
Object.class #=> Class
BasicObject.class #=> Class

"Aha! 我想到了。我们真正创建了一个Class的实例:BasicObject = Class.new。但是我记得所有这些实例都处于一个层次结构中,其中Class位于底部:Class < Module < Object < Kernel < BasicObject

每个类同时也是对象。这样,系统似乎高度循环。层次结构从何处开始,如何融合形成Ruby的抽象结构?

"

1
我想引用Jörg W Mittag这个优秀答案。我认为它提供了Ruby基本类之间关系的非常好的描述。 - Matheus Moreira
1
那个答案中的一个启示性语录:“BasicObject、Object、Module和Class都需要同时产生,因为它们存在循环依赖关系。” - fny
2个回答

2
重新打开僵尸问题,以添加我美丽的图表 :)
*Class*
  ↓
BasicObject ~= 'Parent class of all classes but "inherits" from [Class] - causing an interrelated loop'Object      ~= Class.new(BasicObject) {}
  ↓
Module      ~= Class.new(Object) {}
  ↓
*Class*     ~= Class.new(Module) {}

1
在Ruby中,一切都是一个对象(< BasicObject),类也是如此。类是类Class的对象。类Object的对象不一定是一个类。但是,类Object本身是一个Class,并且类BasicObject也是一个Class。明白了吗?不?那我们继续吧。(正如Matz在他的介绍中所说的:))
换句话说,你理解得没错。

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