Cuando se envía un mensaje, un objeto Ruby busca para ver si tiene un método con ese nombre para responder. Su búsqueda de método busca en el siguiente orden y usa el primer método que encuentra.Ruby: determinar el origen del método?
- métodos Singleton definidos sobre sí misma (también conocidos como métodos en su "eigenclass")
- métodos definidos en su clase
- Cualquier módulos mezclan en su clase, en el orden inverso de la inclusión (sólo el primer inclusión de una El módulo dado tiene algún efecto: si la superclase incluye el módulo A, y la subclase lo incluye de nuevo, se ignora en la subclase; si la subclase incluye A, entonces B y A, se ignora la segunda A) (actualización: tenga en cuenta que fue escrito antes de que
Module.prepend
existiera) - Su clase de padres
- Cualquier método de mezclado en la clase padre, el padre del padre, etc.
O, para decirlo más simplemente, lo que parece en sí misma, entonces todo en self.class.ancestors
en el orden en que aparecen.
Esta ruta de búsqueda se sigue en el momento en que se llama al método; si crea una instancia de una clase, luego vuelve a abrir la clase y agrega un método o mezcla uno a través de un módulo, la instancia existente obtendrá acceso a ese método.
Si todo esto falla, se ve a ver si tiene un método method_missing
, o si lo hace su clase, su clase padre, etc.
Mi pregunta es la siguiente: aparte de examinar el código a mano , o utilizando métodos de ejemplo como puts "I'm on module A!"
, ¿puede decir de dónde vino un método determinado? ¿Puede, por ejemplo, enumerar los métodos de un objeto y ver "éste está en la clase padre, este está en el módulo A, este está en la clase y anula la clase padre," etc.?
puede obtener el método #owner en 1.8.6 utilizando la joya de backports. – rogerdpack
Otro poco de genialidad: los objetos 'Method' también tienen un método' source_location'. "Ahora, ¿dónde está ese parche de mono molesto? ..." :) –
No puedo creer que no tenía idea de eso. ¡Tan útil! Muchas gracias. – dimitarvp