我一直在阅读Metaprogramming Ruby,对象模型就像鸡或蛋的困境。
在Ruby 1.8中,Object类是Class的一个实例。 Module的超类是Object,是Class的一个实例。类的超类是Module,它是Class的一个实例(自引用)。说类SomeClass;结束在某处定义; SomeClass是Class的一个实例,但是它的超类是Object。为什么Class的实例将Object作为超类而不是nil?
另外,如果Object存在,那么Class必须存在,但是Module必须存在,但是对于Module来说,Object必须存在。这些类是如何创建的?
答案 0 :(得分: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);
Ruby中rb_cBasicObject
为BasicObject
,Ruby中rb_cObject
为Object
,依此类推。
答案 1 :(得分:1)
最容易考虑的是ruby中的所有内容都是Object。其他一切都是对这个概念的修改。因此类Class通过修改Object来添加类功能。因此,每个Object都是一个类等。
Object的超类是nil。 (Reference)德尔>
Object的超类是BasicObject(在1.9中),BasicObject的超类是nil。
答案 2 :(得分:1)
您可以在Ruby Hacking Guide中找到更多详细信息:http://rhg.rubyforge.org/
特别是第04章:Bootstrap