Vamos a echar un vistazo al archivo class.c
del código fuente de resonancia magnética:
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;
}
Estas definiciones en ruby.h
son muy importantes, también:
#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)
Tenga en cuenta que Object
, Module
y Class
son derivado de BasicObject
. De hecho,
irb(main):001:0> BasicObject.superclass
=> nil
Esos objetos se define de forma simultánea y todos ellos tienen RBASIC(*)->klass = rb_cClass
.
O para el caso 'Object.class = Class'. ?? La clase Object (la raíz en Ruby OM) es Class? ¿Pero la clase aún no se ha definido? – Vassilis
Esta no es realmente una pregunta bien definida, pero tal vez [este diagrama] (http://phrogz.net/RubyLibs/RubyMethodLookupFlow.png) ayude. – Phrogz
el diagrama muestra superclases y clases propias. No de qué clase es cada objeto en tu diagrama – Vassilis