2010-05-18 8 views
5

He estado leyendo Metaprogramación de Ruby y el modelo de objetos es como el dilema del huevo o la gallina.¿Qué es lo primero en el modelo de objetos de Ruby?

En Ruby 1.8, la clase Object es una instancia de Class. La superclase del módulo es Object y es una instancia de Class. La superclase de clase es Módulo, y es una instancia de Clase (autorreferencial). Say class SomeClass; el final se define en alguna parte; SomeClass es una instancia de Class, sin embargo, su superclase es Object. ¿Por qué una instancia de Class tiene Object como la superclase en lugar de nil?

Además, si Object existe, entonces la clase debe existir, pero luego debe existir el módulo, pero para que el módulo exista debe existir el objeto. ¿Cómo se crean estas clases?

Respuesta

5

Aquí es un completo diagrama de clases de Ruby (para Ruby 1.8): http://banisterfiend.wordpress.com/2008/11/25/a-complete-ruby-class-diagram/

Para ayudar a entender la naturaleza auto-reflexiva aparentemente imposible extraña del diagrama de clases es útil saber que los indicadores de la clase y punteros superclase se puede asignar en cualquier momento en la API de C Es decir, puede crear un objeto (en la API C) y después de los hechos decidir a qué apuntan los punteros Class y Super.

Además, para entender el orden de definición, un vistazo a Init_Object() en object.c (en 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); 

Dónde rb_cBasicObject es BasicObject en Ruby, rb_cObject es Object en Ruby, y así sucesivamente.

1

Lo más fácil tener en cuenta es que todo en rubí es un objeto. Todo lo demás es una modificación de este concepto. Entonces, la clase class agrega una funcionalidad tipo clase, modificando Object. Como resultado, cada objeto es una clase, etc.

La superclase de Object is nil. (Reference)

La superclase de Object es BasicObject (en 1.9) y la superclase de BasicObject es nula.

+0

bien, así que objeto se crea en primer lugar (en 1.8) y luego se modificó más tarde para que la clase de objetos # es clase? – Timothy

Cuestiones relacionadas