2010-05-18 75 views
5

我一直在阅读Metaprogramming Ruby,对象模型就像鸡或鸡蛋的困境。Ruby的对象模型是什么?

在Ruby 1.8中,Object类是Class的一个实例。 Module的超类是Object,它是Class的一个实例。 Class'超类是Module,它是Class(自引用)的一个实例。说班级SomeClass;结尾定义在某处; SomeClass是Class的一个实例,但它的超类是Object。为什么Class的一个实例将Object作为超类而不是nil?另外,如果Object存在,那么Class必须存在,但是Module必须存在,但是Module存在Object必须存在。这些类是如何创建的?

回答

5

下面是一个完整的Ruby类图(为Ruby 1.8):http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

为了帮助你理解类图是知道类指针和超类指针有用的怪看似不可能自我反省的性质可以随时在C API中分配。也就是说,您可以创建一个对象(在C API中)并且事后决定Class和Super类指针指向什么。

此外,了解定义的顺序,看Init_Object()object.c(Ruby 1.9中)

rb_cBasicObject = boot_defclass("BasicObject", 0); 
rb_cObject = boot_defclass("Object", rb_cBasicObject); 
rb_cModule = boot_defclass("Module", rb_cObject); 
rb_cClass = boot_defclass("Class", rb_cModule); 

metaclass = rb_make_metaclass(rb_cBasicObject, rb_cClass); 
metaclass = rb_make_metaclass(rb_cObject, metaclass); 
metaclass = rb_make_metaclass(rb_cModule, metaclass); 
metaclass = rb_make_metaclass(rb_cClass, metaclass); 
boot_defmetametaclass(rb_cModule, metaclass); 
boot_defmetametaclass(rb_cObject, metaclass); 
boot_defmetametaclass(rb_cBasicObject, metaclass); 

rb_cBasicObject是红宝石BasicObjectrb_cObject是红宝石Object,等等。

1

要考虑的最简单的事情是,一切都在红宝石是一个对象。其他一切都是对这个概念的修改。所以类类通过修改Object来添加类的功能。因此每个对象都是一个类,等等。

Object的超类为零。 (Reference

Object的超类是BasicObject(在1.9中),而BasicObject的超类是nil。

+0

好了,对象是首次创建(1.8),然后在以后修改,使得对象#类是类? – Timothy 2010-05-18 18:48:10

相关问题