plantilla formato array ruby methods

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

  1. ¿Qué clases / módulos se buscan para resolver los métodos utilizados en los objetos Candy?

    p Candy.ancestors # => [Candy, Object, Kernel]

  2. ¿Candy tiene un método llamado homer?

    p Candy.instance_methods (false) .grep ("homer") # => []

    p Candy.private_instance_methods (false) .grep ("homer") # => []

  3. OK Candy no tiene ningún método llamado ''jonrón''.

  4. ¿Qué sigue en la cadena de búsqueda (ver 1) => "Objeto"

  5. ¿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

  1. ¿Qué es el yo justo antes de que se defina el jonrón?

    p self # => main def homer pone "Hello" end

  2. 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 .