rails metodos clases ruby self

metodos - Ruby Definition of Self



metodos en ruby (3)

Estaba leyendo un libro de Ruby y encontré esta definición del yo seudovariable:

autorreceptor objeto del método actual

¿Podría alguien desglosar esa definición y explicar lo que significa? No entiendo nada de eso.

EDITAR: en realidad 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


autorreceptor objeto del método actual

La "llamada de método" en Ruby se realiza a través de un mecanismo de envío de mensajes. Asi que

some_object.some_method(args)

es una forma abreviada de

some_object.send(:some_method, args)

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

Todo el envío de mensajes es parte de lo que hace a Ruby 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.


Ruby y otros lenguajes (como Smalltalk y Objective-C) prefieren el término "mensaje que pasa", 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 - código de ejecución en el contexto de un objeto - mientras que el "modo Ruby" es enviar un objeto a un mensaje, al cual el objeto responde ejecutando su método.

Ruby describiría la línea my_string.length como "enviando a my_string el mensaje de length ". my_string recibe el mensaje, y así se llama el receptor; dentro de la definición del método de 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 un mensaje a un objeto que puede elegir manejar de forma dinámica (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).


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 Programación de Ruby : más sobre métodos y clases y objetos .

Llame a un método especificando un receptor, el nombre del método y, opcionalmente, algunos parámetros y un bloque asociado.

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

En este ejemplo, la connection del objeto es el receptor, downloadMP3 es el nombre del método, "jitterbug" es el parámetro, y el material entre las llaves 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. Entonces, dentro del método twoTimes , self refiere al objeto foo en el contexto.

También hay una muy buena explicación aquí