2009-05-17 15 views
9

que estaba leyendo un libro de Ruby y me encontré con esta definición de la pseudo-variable de auto:Rubí definición de libre

auto - receptor objeto del método actual

Podría alguien descomponer esa definición y explica lo que significa? No entiendo nada de eso.

EDIT: Tengo una idea bastante buena de lo que es (y sus aplicaciones) y sé cómo buscar en Google. Me preguntaba si alguien podría explicar la definición que cité. Eso específicamente

+0

http://www.jimmycuadra.com/posts/self-in-ruby – royhowie

Respuesta

11

self es una variable especial que cambia según el contexto. Para ser más específico, es receptor objeto del método actual, como mencionaste. Para entender esto, necesitamos entender qué significa receptor.

Ver Programming Ruby: More About Methods y Classes and Objects.

llama a un método mediante la especificación de un receptor , el nombre del método, y opcionalmente algunos parámetros y un bloque de asociado.

connection.downloadMP3("jitterbug") { |p| showProgress(p) } 

En este ejemplo, el objeto connection es el receptor, downloadMP3 es el nombre del método, "jitterbug" es el parámetro , y la materia entre las tirantes es el bloque asociado.

foo = "hello" 
bar = foo.dup 
class <<foo 
    def to_s 
    "The value is '#{self}'" 
    end 
    def twoTimes 
    self + self 
    end 
end 

foo.to_s  » "The value is 'hello'" 
foo.twoTimes » "hellohello" 
bar.to_s  » "hello" 

En foo.twoTimes, foo parte se llama el receptor de la llamada al método. Por lo tanto, dentro del método twoTimes, self se refiere al objeto foo en el contexto.

There is also a very good explanation here

+0

@MauricioGracia No estoy seguro de cuál fue la intención de la edición. Si el enlace es útil, ¿no debería ser independiente como respuesta? –

+0

la intención de la edición era complementar una buena respuesta: usar un solo enlace como respuesta es una mala práctica (generalmente sugieren colocar el contenido del enlace en lugar de solo el enlace) –

17

Ruby y otros idiomas (como Smalltalk y Objective-C) prefieren el término "paso de mensajes", mientras que Java y C++ prefieren "invocación de método". Es decir, la "forma Java" es llamar a un método en un objeto — ejecutando código en el contexto de un objeto —, mientras que la "forma Ruby" es enviar un objeto a un mensaje, al que el objeto responde ejecutando su método.

Ruby describiría la línea my_string.length como "enviando my_string el mensaje length". El my_string recibe el mensaje, y así se llama el receptor; dentro de la definición del método length, self se referiría a my_string. Puede obtener el mismo efecto con my_string.send(:length).

Pensar en este concepto en términos de transmisión de mensajes es más flexible que pensar en términos de invocación de métodos. Para invocar un método en un objeto, ese método debe haber sido predefinido, mientras que puede enviar a un objeto un mensaje que puede elegir manejar dinámicamente (con respond_to? y method_missing).Esta flexibilidad es un aspecto que permite que Ruby se utilice como lenguajes específicos de dominio conciso (DSL).

4

auto - receptor objeto de la actual método

"método de llamada" en Ruby se logra a través de un mecanismo de envío de mensajes. Así

some_object.some_method(args) 

es una abreviatura de

some_object.send(:some_method, args) 

Creo que esto es lo que la cita se refiere a: "auto" es el objeto al que se ha enviado el mensaje (o método): el receptor del método actual.

Todo lo que envía mensajes es parte de lo que hace que Ruby sea tan dinámico. Hace que sea fácil para un objeto definir method_missing para los mensajes que no maneja actualmente y decidir qué hacer con ellos. Rails usa esto mucho: ActiveRecord, por ejemplo, tiene la sintaxis "find_by ...", que calcula lo que se quiere del nombre del método llamado/enviado.