2009-08-02 26 views

Respuesta

10

clase devuelve la clase (# tipo) no el antepasado. La clase de Objects es Class. La clase de la clase es Clase. La clase es un objeto. Verdad en publicidad: nunca aprendí Ruby, pero la relación Object-Class tiene que es la que Smalltalk estableció hace 30 años.

+4

metaclases funcionan de manera diferente en Ruby: consiguen inyectan en la cadena de búsqueda de métodos, por tanto, Ruby no tiene las dos jerarquías paralelas de clases y metaclases, pero, como dices, los conceptos básicos son idénticos. –

+0

@Jorg: gracias. Tan pronto como termine mi proyecto actual, retomaré los rieles y el rubí, he escuchado tantas alabanzas que estoy intrigado :) –

+0

Gracias. Creo que ahora tengo claras las relaciones. La información de @Jörg_W_Mittag también ayuda. Es decir, las clases y las Metaclases son dos conceptos diferentes pero relacionados. – fwoncn

5

Esta es la forma en que funciona en Ruby 1.9:

Class.class = Class 

Class.superclass = Module 
Module.class = class 
Module.superclass = Object 
Object.class = Class 
Object.superclass = BasicObject 
BasicObject.class = Class 
BasicObject.superclass = nil 
6

Object 's clase es Class (ya Object sí es una clase), y Object es un antepasado de Class.

Hay una referencia circular, es bastante compleja. Mi recomendación personal, si realmente no necesitas jugar con ella, no vayas allí.

9

clase, objeto, módulo y todas las demás clases son casos de un clase Clase :)

CLASS.CLASS == módulo.clase == Object.class == Hash.class == Clase

clase es también un objeto (como cualquier otro objeto en el sistema), pero no es instancia directa de objetos, que es una instancia de una derivados clase (clase en este caso)

Class.superclass.superclass == Objeto (con el Módulo en el medio)

El objeto en sí también es una clase. tan Object.class == Clase

Clase, Módulo y Objeto tienen una dependencia circular ya que están en el núcleo del modelo OO.

Object.class.superclass.superclass == Objeto

=> parent (.superclass) 
-> instance-of (.class) 

alt text http://www.grabup.com/uploads/b10b2ffa9976953e3d6f88e6fcbf6f28.png?direct

+0

La dependencia circular funciona porque todas estas son clases integradas. Son parte del tiempo de ejecución Ruby básico y están configurados de esta manera en la puesta en marcha y no se agregan en la forma en que normalmente se agregaría una clase. El tiempo de ejecución tiene el poder de configurar los punteros como lo desee, y el diseñador eligió hacerlo de esta manera. –

Cuestiones relacionadas