Class.superclass = Module,Module.class = Class?

Vas*_*lis 10 ruby

这是如何计算的?这是循环的

更新:(在irb中)

Class.superclass = Module
Module.class = Class
Run Code Online (Sandbox Code Playgroud)

当Class是Module underclass时,怎么可能说Module的类是Class?这是圆形,鸡肉和鸡蛋的东西.

对象:相同的问题:对象是对象模型中的根对象.它的类怎么能成为Class,因为Class对象还不存在呢?

Dan*_*ara 10

我们来看看class.cMRI源代码的文件:

void Init_class_hierarchy(void)
{
    id_attached = rb_intern("__attached__");

    rb_cBasicObject = boot_defclass("BasicObject", 0);
    /* boot_defclass is defined as boot_defclass(const char *name, VALUE super) */
    rb_cObject = boot_defclass("Object", rb_cBasicObject);
    rb_cModule = boot_defclass("Module", rb_cObject);
    rb_cClass =  boot_defclass("Class",  rb_cModule);

    /* Very important line: */
    RBASIC(rb_cClass)->klass
          = RBASIC(rb_cModule)->klass
          = RBASIC(rb_cObject)->klass
          = RBASIC(rb_cBasicObject)->klass
          = rb_cClass;
 }
Run Code Online (Sandbox Code Playgroud)

这些定义ruby.h也非常重要:

#define R_CAST(st)   (struct st*)
#define RBASIC(obj)  (R_CAST(RBasic)(obj))
#define ROBJECT(obj) (R_CAST(RObject)(obj))
#define RCLASS(obj)  (R_CAST(RClass)(obj))
#define RMODULE(obj) RCLASS(obj)
Run Code Online (Sandbox Code Playgroud)

请注意Object,Module并且Class源自BasicObject.确实,

irb(main):001:0> BasicObject.superclass
=> nil
Run Code Online (Sandbox Code Playgroud)

这些对象是同时定义的,所有对象都有RBASIC(*)->klass = rb_cClass.