Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
end
end
end
    Sofern Sie keine komplizierte Metaprogrammierung mit Ruby betreiben, ist es recht unwahrscheinlich, dass Sie eine solche Hilfsfunktion
eigenclass
benötigen. Es lohnt sich aber trotzdem, Eigenklassen zu verstehen, weil Sie Ihnen gelegentlich in bestehendem Code über den Weg laufen werden und ein wichtiger Bestandteil des Algorithmus zur Namensauflösung für Methoden in Ruby sind — was das nächste Thema sein wird.

7.8 Methoden-Lookup
    Wenn Ruby einen Methodenaufrufausdruck auswertet, muss es zunächst herausbekommen, welche Methode aufzurufen ist. Dieser Prozess wird als Methoden-Lookup oder Methodennamensauflösung bezeichnet. Um den Methodenaufrufausdruck
o.m
auszuwerten, führt Ruby folgende Schritte durch:
    Zuerst wird geprüft, ob die Eigenklasse von
o
eine Singleton-Methode namens
m
besitzt.
Wenn in der Eigenklasse keine Methode
m
gefunden wurde, sucht Ruby in der Klasse von
o
nach einer Instanzmethode namens
m
.
Wenn in der Klasse keine Methode
m
gefunden wurde, sucht Ruby in den Instanzmethoden aller Module, die von der Klasse von
o
eingebunden sind. Wenn diese Klasse mehr als ein Modul enthält, werden sie in der umgekehrten Reihenfolge ihrer Einbindung durchsucht — das heißt, das letzte eingebundene Modul zuerst.
Wenn in der Klasse von
o
oder in seinen Modulen keine Instanzmethode
m
gefunden wurde, wird mit der Suche über die Vererbungshierarchie in der Superklasse fortgefahren. Die Schritte 2 und 3 werden für jede Klasse in der Vererbungshierarchie wiederholt, bis jede Vorfahrenklasse und ihre eingebundenen Module durchsucht wurden.
Wenn nach der gesamten Suche keine Methode mit dem Namen
m
gefunden wurde, wird stattdessen eine Methode namens
method_missing
aufgerufen. Um eine passende Definition dieser Methode zu finden, beginnt der Algorithmus zur Namensauflösung wieder bei Schritt 1. Das Modul
Kernel
stellt eine Standardimplementierung von
method_missing
bereit, so dass dieser zweite Durchlauf garantiert erfolgreich endet. Die Methode
method_missing
wird detaillierter in „8.4.5 Undefinierte Methoden behandeln“ behandelt.
    Lassen Sie uns ein konkretes Beispiel dieses Algorithmus anschauen. Gehen wir von folgendem Code aus:
message = "Hallo"
message.world
    Wir wollen eine Methode
world
für die
String
-Instanz
"Hallo"
aufrufen. Die Namensauflösung verläuft dann wie folgt:
    Prüfe die Eigenklasse auf Singleton-Methoden. In diesem Fall gibt es keine.
Prüfe die Klasse
String
. Es gibt keine Instanzmethode namens
world
.
Prüfe die Module
Comparable
und
Enumerable
der Klasse
String
auf eine Instanzmethode namens
world
. Keines der Module definiert solch eine Methode.
Prüfe die Superklasse von
String
:
Object
. Die Klasse
Object
definiert ebenfalls keine Methode namens
world
.
Prüfe das Modul
Kernel
, das von
Object
eingebunden wird. Die Methode
world
wird hier auch nicht gefunden, daher suchen wir nun nach einer Methode namens
method_missing
.
Suche nach
method_missing
an jeder der oben angegebenen Stellen (die Eigenklasse des
String
-Objekts, die Klasse
String
, die Module
Comparable
und
Enumerable
, die Klasse
Object
und das Modul
Kernel
). Die erste Definition von
method_missing
finden wir im Modul
Kernel
, daher rufen wir diese Methode auf. Das führt zu einer Exception:
NoMethodError: undefined method 'world' for "Hallo":String
    Das sieht so aus, als ob Ruby damit bei jedem Aufruf einer Methode eine umfangreiche Suche durchführen würde. In den meisten Implementierung werden erfolgreiche Methoden-Lookups aber zwischengespeichert, so dass folgende Lookups desselben Namens (ohne zwischenzeitliche Methodendefinitionen) sehr schnell ausgeführt werden können.
    7.8.1 Lookup von Klassenmethoden
    Der Algorithmus zur Namensauflösung von Klassenmethoden entspricht genau dem von Instanzmethoden, allerdings gibt es eine kleine Besonderheit. Lassen Sie uns mit einem einfachen Fall beginnen, ohne den Sonderfall. Dies ist eine Klasse
C
, die keine eigenen Klassenmethoden definiert:
class C
end
    Denken Sie daran, dass die Konstante
C
nach dem Definieren dieser Klasse ein Objekt referenziert, das eine Instanz von
Class
ist. Alle Klassenmethoden, die wir definieren, sind einfach Singleton-Methoden des Objekts
C
.
    Nachdem wir eine Klasse
C
definiert haben, werden wir sehr wahrscheinlich einen Methodenaufrufausdruck schreiben, der die Klassenmethode
new
enthält:
c = C.new
    Um die Methode
new
aufzulösen, schaut Ruby zuerst nach Singleton-Methoden in der Eigenklasse des Objekts
C
.

Weitere Kostenlose Bücher