2011-09-25 15 views
6

Estaba estudiando cómo se implementa el intérprete de Ruby, y se produjo una pregunta que todavía no me ha respondido. Esa es la del título: desde Class (r_cClass) tiene super establecido en sí mismo (ignorando las metaclases, ya que en realidad super es la metaclase de r_cClass), si envío un método al objeto Class, esto se buscará en la tabla de métodos de Class 'clase. Pero la clase Class 'es Class, entonces ¿no debería terminar buscando los métodos de instancia de Class? Pero ese no es el caso, ya que en la documentación, los métodos de clase Class y los métodos de instancia Class están separados. En el search_method en eval.c de Ruby, no encontré ningún control especial para la clase Class. ¿Alguien puede arrojar algo de luz sobre esto?¿Cómo puede la clase ser de la clase Class y no tener métodos de instancia de clase?

+0

En una pregunta tan abstracta como esta, probablemente sea una buena idea dar ejemplos específicos, como un ejemplo de un método de instancia y un ejemplo de un método de clase. –

Respuesta

3

Sus creencias sobre la forma en que debería funcionar parecen correctas, pero no estoy seguro de por qué cree que no funciona de esa manera.

en Ruby 1.8.7:

irb> a = Class.new.methods - Object.new.methods 
=> [... 36 element array ...] 
irb> b = Class.methods - Object.new.methods 
=> [... 37 element array ...] 
irb> b - a 
=> ["nesting"] 

una instancia de clase normal (Class.new) tiene 36 métodos de instancia. Si miro Class, que también es una instancia de clase normal, tiene los mismos 36 métodos de instancia, más 1 método de clase adicional (anidación), que existe solo porque se hereda de su Módulo de superclase.

Tenga en cuenta que agregar un método de instancia a la clase también lo agrega automáticamente como método de clase, pero agregar una clase a la metaclase de la clase no lo hará.

irb> class Class ; def everywhere ; true ; end ; end 
irb> class << Class ; def only_singleton ; true ; end ; end 
irb> Class.everywhere 
=> true 
irb> Class.new.everywhere 
=> true 
irb> Class.only_singleton 
=> true 
irb> Class.new.only_singleton 
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8> 
+0

Entonces, los métodos son de hecho lo mismo. En realidad, no hay ninguna pista en el código fuente que me condujo a este pensamiento. Es solo que los documentos de Ruby separan claramente el método de instancia de Clase de los métodos Singleton de Clase. Es esa separación hecha solo por claridad? – eugeniodepalo

+0

¿Por métodos singleton te refieres a los métodos de clase? – rdvdijk

+0

Sí, me refiero a los métodos de clase. – eugeniodepalo

Cuestiones relacionadas