这是如何计算的?这是循环的
更新: (在irb中)
Class.superclass = Module
Module.class = Class
如果Class是Module underclass,怎么可能说Module的类是Class?这是圆形,鸡肉和鸡蛋的东西。
对象:同一问题:对象是对象模型中的根对象。它的类如何才是Class,因为Class对象还不存在呢?
答案 0 :(得分:10)
让我们看一下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
。
答案 1 :(得分:3)
x.superclass
和x.class
具有不同的语义。观察:
irb(main):003:0> 3.superclass
NoMethodError: undefined method `superclass' for 3:Fixnum
from (irb):3
from :0
irb(main):004:0> 3.class
=> Fixnum
3
没有superclass
,因为...... 3
不是类或类似的类。但3.class
表示3
是。的实例。
所以与Class.superclass
对应的内容不是Module.class
,而是Module
本身。
答案 2 :(得分:2)
循环依赖有效,因为它们都是内置类。它们是核心Ruby运行时的一部分,并且在启动时以这种方式设置,并且不会以通常添加类的方式添加。运行时有能力设置它想要的指针,设计师选择这样做。