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:
Methode
freeze
der Klasse auf. Nach dem »Einfrieren« kann eine Klasse nicht mehr verändert werden.
    8.4.5 Undefinierte Methoden behandeln
    Wenn es dem Methodennamen-Auflösungsalgorithmus (siehe „7.8 Methoden-Lookup“ ) nicht gelingt, eine Methode zu finden, sucht er stattdessen nach einer Methode namens
method_missing
. Wenn diese Methode aufgerufen wird, ist das erste Argument ein Symbol, das den Namen der nicht gefundenen Methode angibt. Auf dieses Symbol folgen alle Argumente, die der ursprünglichen Methode übergeben wurden. Wenn ein Block mit dem Methodenaufruf verknüpft ist, wird auch dieser Block an
method_missing
übergeben.
    Die Standardimplementierung von
method_missing
im Modul
Kernel
löst einfach einen
NoMethodError
aus. Wenn diese Ausnahme nicht abgefangen wird, sorgt sie dafür, dass das Programm mit einer Fehlermeldung beendet wird, was Sie normalerweise auch erwarten würden, wenn Sie versuchen, eine Methode aufzurufen, die nicht existiert.
    Die Definition Ihrer eigenen
method_missing
-Methode für eine Klasse gibt Ihnen die Gelegenheit, jegliche Art von Aufruf für Instanzen der Klasse zu verarbeiten. Der Hook
method_missing
ist eine der mächtigsten Dynamikfähigkeiten von Ruby und eines der am häufigsten genutzten Metaprogrammierungsverfahren. Weiter unten in diesem Kapitel werden wir Beispiele für seine Verwendung sehen. Hier fügt der folgende Beispielcode zunächst eine
method_missing
-Methode zur Klasse
Hash
hinzu. Sie ermöglicht uns, den Wert eines benannten Schlüssels zu lesen oder zu setzen, als sei der Schlüssel der Name einer Methode:
class Hash
# Lesen und Setzen von Hash-Werten als Attribute erlauben
# Wir simulieren Attribut-Getter und -Setter für jeden Schlüssel.
def method_missing(key, *args)
    text = key.to_s
    if text[-1,1] == "=" # Wenn Schlüssel mit = endet, Wert setzen
     self[text.chop.to_sym] = args[0] # = vom Schlüssel entfernen
    else # Andernfalls ...
     self[key] # ... einfach Schlüssel-Wert zurückgeben
    end
end
end
h = {} # Ein leeres Hash-Objekt erstellen
h.one = 1 # Dasselbe wie h[:one] = 1
puts h.one # Gibt 1 aus. Dasselbe wie puts h[:one].
    8.4.6 Die Methodensichtbarkeit setzen
    In „7.2 Sichtbarkeit von Methoden: public, protected, private“ wurden
public
,
protected
und
private
vorgestellt. Sie sehen so aus wie Sprachschlüsselwörter, sind aber in Wirklichkeit private Instanzmethoden, die von
Module
definiert werden. Diese Methoden werden normalerweise als statischer Teil einer Klassendefinition verwendet. Aber mit
class_eval
können sie auch dynamisch verwendet werden:
String.class_eval { private :reverse }
"Hallo".reverse # NoMethodError: private method 'reverse'
    private_class_method
und
public_class_method
sind ähnlich, erwarten aber, dass sie mit Klassenmethoden arbeiten und sind selbst public:
# Alle Math-Methoden privat machen
# Nun müssen wir Math einbinden, um seine Methoden aufzurufen.
Math.private_class_method *Math.singleton_methods

8.5 Hooks
    Module
,
Class
und
Object
implementieren diverse Callback-Methoden oder Hooks . Diese Methoden sind standardmäßig nicht definiert, aber wenn Sie sie für ein Modul, eine Klasse oder ein Objekt definieren, dann werden sie beim Eintreten bestimmter Ereignisse aufgerufen. Dies gibt Ihnen eine Gelegenheit, Rubys Verhalten beim Erzeugen von Unterklassen, beim Import von Modulen oder bei der Definition von Methoden zu erweitern. Hook-Methoden (außer einigen veralteten, die hier nicht beschrieben werden) haben Namen, die auf »ed« enden.
    Wenn eine neue Klasse definiert wird, ruft Ruby die Klassenmethode
inherited
für die Oberklasse der neuen Klasse auf und übergibt ihr das neue Klassenobjekt als Argument. Das erlaubt es Klassen, Verhalten zu ihren Nachkommen hinzuzufügen oder ihnen Beschränkungen aufzuerlegen. Denken Sie daran, dass Klassenmethoden vererbt werden, so dass eine
inherited
-Methode aufgerufen wird, wenn einer der Vorfahren der neuen Klasse sie definiert:
def Object.inherited(c)
puts "class #{c} < #{self}"
end
    Wenn ein Modul in eine Klasse oder ein anderes Modul importiert wird, wird die Klassenmethode
included
des eingefügten Moduls aufgerufen, wobei das Klassen- oder Modulobjekt, in das es eingefügt wurde, als Argument übergeben wird. Dies gibt dem importierten Modul die Gelegenheit, die Klasse auf jede gewünschte Weise zu erweitern oder zu ändern – im Prinzip erlaubt es einem Modul, seine eigene Bedeutung von
included
zu definieren. Ein Modul mit

Weitere Kostenlose Bücher