这是如何计算的?是圆形的
更新: (在 irb 中)
Class.superclass = Module
Module.class = Class
当 Class 是 Modules 的下类时,怎么可能说 Module 的类是 Class?它是圆形的,先有鸡还是先有蛋。
对象:同样的问题:对象是对象模型中的根对象。它的类怎么可能是Class,因为Class对象还不存在呢?
最佳答案
我们来看一下MRI源码的class.c
文件:
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;
}
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)
请注意,Object
、Module
和Class
均派生自BasicObject
。确实,
irb(main):001:0> BasicObject.superclass
=> nil
这些对象是同时定义的,并且它们都具有 RBASIC(*)->klass = rb_cClass
。
关于ruby - Class.superclass = 模块,Module.class = 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5768065/