Die Programmiersprache Ruby (German Edition)
Methodenaufruf zu verknüpfen, ist die Basis von Rubys leistungsfähigen Iteratormethoden. In „5.3 Iteratoren und Aufzählungsobjekte“ und „5.4 Blöcke“ erfahren Sie viel mehr über Blöcke, die mit Methodenaufrufen verknüpft werden.
Ein Methodenname wird normalerweise durch einen
.
von dem Objekt getrennt, für das die Mehode aufgerufen wird.
::
ist ebenfalls erlaubt, wird aber selten verwendet, weil Methodenaufrufe dadurch eher wie Konstantenreferenzausdrücke aussehen.
Hat der Ruby-Interpreter den Namen einer Methode und ein Objekt, für das diese aufgerufen wird, dann findet er die entsprechende Definition der genannten Methode mithilfe eines Prozesses, der »Methoden-Lookup« oder »Methodennamensauflösung« genannt wird. Die Details sind hier nicht wichtig, sie werden in „7.8 Methoden-Lookup“ gründlich erklärt.
Der Wert eines Methodenaufrufausdrucks ist der Wert des zuletzt ausgewerteten Ausdrucks im Rumpf der Methode. In Kapitel 6 wird genauer auf Methodendefinitionen, Methodenaufrufe und Methodenrückgabewerte eingegangen. Hier sind trotzdem einige Beispiele für Methodenaufrufe:
puts "Hallo Welt" # "puts"-Aufruf für self mit einem String-Argument
Math.sqrt(2) # "sqrt"-Aufruf für Objekt Math mit einem Argument
message.length # "length"-Aufruf für Objekt message, ohne Argumente
a.each {|x| p x } # "each"-Aufruf für Objekt a, mit verknüpftem Block
----
Globale Funktionen aufrufen
Schauen Sie sich diesen weiter oben gezeigten Methodenaufruf noch einmal an:
puts "Hallo Welt"
Dies ist ein Aufruf der
Kernel
-Methode
puts
. Von
Kernel
definierte Methoden sind globale Funktionen, genau wie alle Methoden, die auf der höchsten Ebene außerhalb aller Klassen definiert werden. Globale Funktionen werden als private Methoden der Klasse
Object
definiert. Private Methoden lernen wir in Kapitel 7 kennen. Im Moment brauchen Sie nur zu wissen, dass es nicht erlaubt ist, private Methoden explizit für ein Empfängerobjekt aufzurufen – sie werden stets implizit für
self
aufgerufen.
self
ist immer definiert, und egal welchen Wert es hat, ist dieser Wert ein
Object
. Da globale Funktionen Methoden von
Object
sind, können diese Methoden immer (implizit) in jedem Kontext aufgerufen werden, unabhängig vom Wert von
self
.
----
Eines der weiter oben gezeigten Methodenaufrufbeispiele war
message.length
. Sie könnten versucht sein, sich das als Variablenreferenzausdruck vorzustellen, der den Wert der Variablen
length
im Objekt
message
ergibt. Dies ist jedoch nicht der Fall. Ruby hat ein rein objektorientiertes Programmiermodell: Ruby-Objekte können eine beliebige Anzahl von Instanzvariablen kapseln, präsentieren der Außenwelt aber nur Methoden. Da die Methode
length
keine Argumente erwartet und ohne die optionalen Klammern aufgerufen wird, sieht sie wie eine Variablenreferenz aus. Das ist sogar Absicht: Methoden wie diese heißen Attribut-Akzessormethoden, und wir sagen, dass das Objekt
message
ein
length
-Attribut besitzt. [ 13 ] Wie wir sehen werden, ist es möglich, dass das Objekt
message
eine Methode namens
length=
definiert. Wenn diese Methode ein einzelnes Argument erwartet, ist sie eine Attribut-Setter-Methode, und Ruby ruft sie als Reaktion auf eine Wertzuweisung auf. Wenn eine solche Methode definiert ist, rufen die beiden folgenden Codezeilen dieselbe Methode auf:
message.length=(3) # Traditioneller Methodenaufruf
message.length = 3 # Als Wertzuweisung maskierter Methodenaufruf
Betrachten Sie nun die folgende Codezeile unter der Vorgabe, dass die Variable
a
ein Array enthält:
a[0]
Wieder könnten Sie denken, dass das eine spezielle Art der Variablenreferenz ist, bei der die fragliche Variable eigentlich ein Array-Element ist. Jedoch handelt es sich auch hier um einen Methodenaufruf. Der Ruby-Interpreter konvertiert den Array-Zugriff zu
a.[](0)
Der Array-Zugriff wird zu einem Aufruf der Methode namens
[]
für das Array, mit dem Array-Index als Argument. Diese Array-Zugriffssyntax ist nicht auf Arrays beschränkt. Jedes Objekt darf eine Methode namens
[]
definieren. Wenn das Objekt mit eckigen Klammern »indexiert« wird, werden jegliche Elemente innerhalb der Klammern an die Methode übergeben. Wenn die Methode
[]
so geschrieben wurde, dass sie drei Argumente erwartet, sollten Sie drei durch Kommata getrennte Ausdrücke in die eckigen Klammern schreiben.
Wertzuweisung an Arrays erfolgt ebenfalls mithilfe von Methodenaufrufen. Wenn das Objekt
o
eine Methode namens
[]=
definiert, wird
Weitere Kostenlose Bücher