ruby - formato - twig document
Acceso a métodos en Ruby (4)
La definición del método "homer" es agregar el método a la clase Object. No está definiendo una función libre.
Class Candy hereda implícitamente de Object, y también tiene acceso a los métodos en Object. Cuando llama "homer" en el método "land", la resolución del método no puede encontrar una definición en la clase actual, va a la superclase, encuentra el método que ha agregado a Object y lo llama.
¿Cómo es que Ruby permite métodos de acceso de clase fuera de la clase implícitamente?
Ejemplo:
class Candy
def land
homer
end
end
def homer
puts "Hello"
end
Candy.new.land #Outputs Hello
Una forma simple de descubrir lo que sucede
¿Qué clases / módulos se buscan para resolver los métodos utilizados en los objetos Candy?
p Candy.ancestors # => [Candy, Object, Kernel]
¿Candy tiene un método llamado homer?
p Candy.instance_methods (false) .grep ("homer") # => []
p Candy.private_instance_methods (false) .grep ("homer") # => []
OK Candy no tiene ningún método llamado ''jonrón''.
¿Qué sigue en la cadena de búsqueda (ver 1) => "Objeto"
¿Objeto tiene un método llamado "homer"? p Object.instance_methods (false) .grep ("homer") # => []
p Object.private_instance_methods (false) .grep ("homer") # => ["homer"]
Candy tiene Object en su cadena de búsqueda que a su vez tiene un método de instancia privado "homer" para que la resolución del método tenga éxito
El enunciado def siempre define el método en la clase de cualquier yo que esté en el punto de definición
¿Qué es el yo justo antes de que se defina el jonrón?
p self # => main def homer pone "Hello" end
Entonces, ¿cuál es su tipo?
p self.class # => Object
Que es por lo que el jonrón termina en el objeto
Técnicamente, la definición del método de homer
es en realidad en el módulo Kernel
que se mezcla en Object
, no en Object
directamente.Entonces, cuando el homer
no es una variable local o un método de instancia definido en Candy
, la cadena de herencia del método Ruby se sigue por Object
y luego al módulo Kernel
mixto y luego se ejecuta este código.
Editar: Lo siento, no sé por qué pensé esto. Parece que el método realmente vive en Object
. No estoy seguro de que haga una gran diferencia en la práctica, pero debería haberlo confirmado antes de publicarlo.
Ruby no tiene funciones de libre flotación. Todos los métodos pertenecen a algún objeto. Los métodos que def
en el nivel superior se están convirtiendo en métodos de instancia de la clase Object
. Como todo es un Object
en algún nivel, todos los objetos tienen acceso a los métodos de instancia de Object
.