2009-05-27 4 views
5

Wenn ich sageIst der "Aufrufer" in Java der selbe wie der "Empfänger" in Ruby?

x.hello() 

In Java-Objekt x "ruft" die Methode enthält.

In Ruby "empfängt" Objekt x die Methode, die es enthält.

Ist das nur eine andere Terminologie für die gleiche Idee oder gibt es hier einen grundlegenden Unterschied in der Ideologie?

Aus Java komme ich Rubys "Empfänger" Idee ziemlich verwirrend. Vielleicht könnte jemand das in Bezug auf Java erklären?

+2

Ich würde nicht sagen, dass Objekt x die Methode, die es enthält, "aufruft". Ich würde sagen, dass ich die Methode * auf * Objekt x "anrufe". (Ich werde das nicht in eine Antwort ausdrücken, weil mein Gehirn heute mit einer Geschwindigkeit von etwa drei Vierteln und einer halben Ambition läuft.) –

+0

Was Sie sagen, stimmt mit Ericksons Antwort überein. – lorz

+1

So ist es. Ich schätze, ich werde ihn dann wählen. –

Antwort

12

In Ihrem Beispiel x ist nicht Aufruf hello(). Jedes Objekt, das dieses Snippet enthält, ruft auf (d. H. Es ist der "Aufrufer"). In Java kann x als der Empfänger bezeichnet werden; Es empfängt den Anruf an die hello() Methode.

5

Jemand korrigiert mich, wenn ich falsch liege, aber ich glaube nicht, dass Sie diese Begriffe auf Java anwenden können. Ruby kommt von Smalltalk, das Nachrichten (keine Methoden) verwendet, um zwischen Objekten zu kommunizieren. Technisch gesehen, wenn Sie myObj.to_s in Ruby tun, senden Sie die to_s Nachricht an myObj und es handelt entsprechend auf diese Nachricht. Mit diesem Modell ist myObj tatsächlich der Empfänger dieser Nachricht und die Klasse, die die Zeile besitzt, in der die Nachricht gesendet wurde, ist der Absender.

In Java existiert das nicht. Sie haben Objekte, für die Sie Methoden aufrufen. Es gibt keine Absender und Empfänger. Sie hatten es richtig, als Sie sagten, dass es einen grundlegenden Unterschied in der Ideologie gibt.

+1

Mein Denken wäre im Einklang mit Ihrem gewesen, also würde ich mir wünschen, dass derjenige, der Sie gewählt hat, erklärt hätte, warum. – lorz

+2

Es ist nur Terminologie: In einer Methode 'this' ist ein Zeiger auf den Empfänger, können Sie den Absender (oder den Aufrufer) abrufen, indem Sie Dinge wie' sun.reflect.Reflection.getCallerClass' und einen Methodenaufruf is_a message send verwenden. –

+0

Ja ... ich stimme zu, als wäre eine Erklärung auch nett. –

6

Der Unterschied ist mehr als die Terminologie. In Java bestimmt die VM, ob ein bestimmtes Objekt die Nachricht annimmt, die Sie senden möchten (d. H. Die Methode, die Sie aufrufen möchten). Wenn der Typraum des Objekts diese Methode nicht definiert, wird eine Ausnahme ausgelöst und die Nachricht wird nie zugestellt.

In Ruby wird die Nachricht immer geliefert. Das Objekt kann eine Methode finden, die zu ihm passt, oder es kann nicht, und im letzteren Fall kann es eine Ausnahme werfen, oder es kann nicht. Rails baut auf diesem grundlegenden Unterschied auf. Dies ist einer der Gründe, warum es noch kein DB-gestütztes Web-App-Framework gibt, das so nützlich ist wie Rails auf der Java-Plattform (obwohl sich einige nähern).

+0

Warum ist diese Funktion in Rails so vorteilhaft? – lorz

+1

Ein Beispiel ist ORM in ActiveRecord. Sie haben ein ActiveRecord-Objekt, das eine Datenbankzeile darstellt, z. B. ein Buch. Es hat keine Methoden, die Ihrer Spalte entsprechen, aber Sie können Dinge wie @ book.isbn tun. @book ruft die Nachricht ab, bemerkt, dass es keine Methode gibt, und sucht dann in der zugehörigen Datenbanktabelle nach einer Spalte mit diesem Namen. Wenn es eine Spalte mit dem richtigen Namen findet, wird der Wert zurückgegeben. Für den Aufrufer sieht es wie ein Methodenaufruf aus, der einen Wert zurückgegeben hat. –

+1

Ich verstehe. Daher ist method_missing verantwortlich für die Fähigkeit, Gänge zu schalten, wenn zur Laufzeit keine Methode gefunden wird. – lorz

Verwandte Themen