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.