2009-05-27 8 views
5

Si digo¿El "que llama" en Java es el mismo que el "receptor" en Ruby?

x.hello() 

En Java, objeto x está "llamando" el método que contiene.

En Ruby, el objeto x está "recibiendo" el método que contiene.

¿Es esta la terminología diferente para expresar la misma idea o hay una diferencia fundamental en la ideología aquí?

Viniendo de Java Encuentro la idea del "receptor" de Ruby bastante desconcertante. Quizás alguien podría explicar esto en relación con Java?

+2

No diría que el objeto x está "llamando" al método que contiene. Diría que estoy "llamando" al método * en * objeto x. (No voy a aclarar esto en una respuesta, porque mi cerebro funciona a una velocidad de tres cuartas partes y media de ambición hoy.) –

+0

Lo que dices es consistente con la respuesta de Erickson. – lorz

+1

Así es. Supongo que lo votaré, entonces. –

Respuesta

12

En su ejemplo x es no llamando al hello(). Cualquier objeto que contenga ese fragmento está "llamando" (es decir, es el "que llama"). En Java, x se puede denominar receptor; está recibiendo la llamada al método hello().

5

Alguien me corrige si me equivoco, pero no creo que pueda aplicar estos términos a Java. Ruby viene de Smalltalk, que usa mensajes (no métodos) para comunicarse entre objetos. Técnicamente, cuando haga myObj.to_s en Ruby, está enviando el mensaje to_s al myObj y está actuando según ese mensaje. Con ese modelo, myObj es de hecho el receptor de este mensaje y la clase que posee la línea donde se envió el mensaje es el remitente.

En Java, esto no existe. Tiene objetos a los que llama métodos. No hay remitentes y receptores. Lo hiciste bien cuando dijiste que hay una diferencia fundamental en la ideología.

+1

Mi pensamiento habría sido consistente con el tuyo, así que desearía que quien te votara hubiera explicado por qué. – lorz

+2

Es solo terminología: en un método 'this' es un puntero del receptor, puede recuperar al emisor (o llamante) usando cosas como' sun.reflect.Reflection.getCallerClass' y una llamada a un método es_un mensaje enviado. –

+0

Sí ... Estoy de acuerdo, que una explicación también sería agradable. –

6

La diferencia es más que terminología. En Java, la VM determina si un objeto dado "acepta" el mensaje que está intentando enviar (es decir, el método que está tratando de llamar). Si el espacio de tipo del objeto no define ese método, se lanza una excepción y el mensaje nunca se entrega.

En Ruby, el mensaje es siempre entregado. El objeto puede encontrar un método que coincida con él, o no, y en este último caso puede lanzar una excepción, o no puede ser. Rails se basa en esta diferencia fundamental. Esta es una de las razones por las que aún no existe un framework de aplicaciones web respaldado por DB tan útil como Rails en la plataforma Java (aunque algunos se están acercando).

+0

¿Por qué esta función es un beneficio en Rails? – lorz

+1

Un ejemplo es ORM en ActiveRecord. Tiene un objeto ActiveRecord que representa una fila de la base de datos, por ejemplo, un libro. No tiene métodos que correspondan a su columna, pero puede hacer cosas como @ book.isbn. @book recibe el mensaje, advierte que no hay un método isbn, y luego busca en la tabla de la base de datos asociada una columna con ese nombre. Si encuentra una columna con el nombre correcto, devuelve el valor. Para la persona que llama, parece una llamada a método que devolvió un valor. –

+1

Ya veo. Así que la falta de método es la responsable de la capacidad de cambiar de marcha cuando no se encuentra ningún método en tiempo de ejecución. – lorz

Cuestiones relacionadas