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?
Respuesta
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>
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
¿Por métodos singleton te refieres a los métodos de clase? – rdvdijk
Sí, me refiero a los métodos de clase. – eugeniodepalo
- 1. clase clase: métodos instancia vs. clase
- 2. Java no puede acceder a los métodos de clase desde la instancia de clase
- 3. Python que anula la clase (no instancia) métodos especiales
- 4. C# eventos y métodos de la clase
- 5. variables de instancia de clase python y variables de clase
- 6. define los métodos de clase y las variables de clase en la clase de referencia R5
- 7. La restricción no puede ser de clase especial 'System.Object'
- 8. instancia codeigniter de la clase de modelo
- 9. ¿Puede una clase interna de una clase de plantilla ser una clase sin plantilla?
- 10. La clase de contrato debe ser una clase abstracta
- 11. ¿Puede una instancia de clase autodestruirse?
- 12. Crear instancia de clase derivada de una instancia de clase base sin conocer los miembros de la clase
- 13. ¿Es legal extender la clase Class?
- 14. La clase foo puede ser diseñado, pero no es la primera clase en el error de archivo
- 15. Variables de instancia de la clase Ruby y herencia
- 16. Redefina los métodos de clase o clase
- 17. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 18. ¿Todos los métodos en la clase principal deben ser estáticos?
- 19. ¿Tener muchos métodos en una clase aumenta la sobrecarga del objeto de esa clase?
- 20. Eliminación de métodos específicos de la clase hija que se heredan de la clase padre
- 21. Uso de variables de instancia en métodos de clase - Ruby
- 22. Derivar clase abstracta de la clase no abstracta
- 23. Creando una instancia de la clase interna
- 24. Mapa de Java, clave = clase, valor = instancia de esa clase
- 25. ¿Por qué la clase de entidad en JPA no puede ser definitiva?
- 26. ¿Es posible tener una instancia de clase de tipo "local"?
- 27. xCode/declarar métodos estáticos en la clase
- 28. Objective-C: Creación de Instancia de la clase de referencia
- 29. Métodos de instancia llamando a métodos de clase llamando a los métodos de instancia
- 30. ¿Cómo hacer referencia a la clase externa en otra instancia de una clase interna no estática?
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. –