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:
einer
included
-Methode kann nicht nur neue Methoden zu der Klasse hinzufügen, in die es importiert wird, sondern es könnte beispielsweise auch bestehende Methoden der Klasse modifizieren:
module Final # Klassen, die Final importieren, können keine Unterklassen
     # haben.
def self.included(c) # Beim Import in Klasse c
    c.instance_eval do # eine Klassenmethode von c erstellen
     def inherited(sub) # Unterklassen entdecken
     raise Exception, # und mit Ausnahme abbrechen
     "Versuch, Unterklasse #{sub} von Final-Klasse #{self} zu erzeugen"
     end
    end
end
end
    Etwas Ähnliches geschieht, wenn ein Modul eine Klassenmethode namens
extended
definiert: Diese Methode wird jedes Mal aufgerufen, wenn das Modul (mit
Object.extend
) zur Erweiterung eines Objekts verwendet wird. Als Argument der Methode
extended
dient natürlich das erweiterte Objekt, und die Methode
extended
kann beliebige Aktionen mit diesem Objekt durchführen.
    Neben den Hooks zur Überwachung von Klassen und den Modulen, die sie importieren, gibt es auch Hooks zur Überwachung der Methoden von Klassen und Modulen sowie der Singleton-Methoden beliebiger Objekte. Definieren Sie eine Methode namens
method_added
für irgendeine Klasse oder ein Modul, und sie wird aufgerufen, wenn eine Instanzmethode für diese Klasse oder dieses Modul definiert wird:
def String.method_added(name)
puts "Neue Instanzmethode #{name} zu String hinzugefügt"
end
    Beachten Sie, dass die Klassenmethode
method_added
an Unterklassen der Klasse, für die sie definiert wird, vererbt wird. Aber an den Hook wird kein Klassenargument übergeben, so dass es keine Möglichkeit gibt, zu unterscheiden, ob die genannte Methode zu der Klasse hinzugefügt wurde, die
method_added
definiert, oder ob sie zu einer Unterklasse dieser Klasse hinzugefügt wurde. Ein Workaround für dieses Problem besteht darin, einen
inherited
-Hook für jede Klasse zu definieren, die einen
method_added
-Hook definiert. Die Methode
inherited
kann dann eine
method_added
-Methode für jede Unterklasse definieren.
    Wenn eine Singleton-Methode für irgendein Objekt definiert wird, wird die Methode
singleton_method_added
für dieses Objekt aufgerufen, und sie erhält den Namen der neuen Methode als Argument. Denken Sie daran, dass Singleton-Methoden bei Klassen Klassenmethoden sind:
def String.singleton_method_added(name)
puts "Neue Klassenmethode #{name} für String"
end
    Interessanterweise ruft Ruby diesen
singleton_method_added
-Hook auf, wenn die Hook-Methode selbst definiert wird. Im Folgenden sehen Sie eine Anwendung dieses Hook. In diesem Fall wird
singleton_method_added
als Instanzmethode für jede Klasse definiert, die ein Modul importiert. Sie wird über jegliche Singleton-Methoden informiert, die zu Instanzen dieser Klasse hinzugefügt werden:
# Import dieses Moduls in eine Klasse verhindert, dass Singleton-
# Methoden zu Instanzen dieser Klasse hinzugefügt werden. Jede hinzugefügte
# Singleton-Methode wird augenblicklich wieder entfernt.
module Strict
def singleton_method_added(name)
    STDERR.puts "Warnung: Singleton #{name} zu Strict-Objekt hinzugefügt"
    eigenclass = class << self; self; end
    eigenclass.class_eval { remove_method name }
end
end
    Neben
method_added
und
singleton_method_added
gibt es Hooks, die überwachen, ob Instanzmethoden und Singleton-Methoden entfernt werden oder ob ihre Definition aufgehoben wird. Wenn eine Instanzmethode einer Klasse oder eines Moduls entfernt wird oder ihre Definition aufgehoben wird, wird die Klassenmethode
method_removed
beziehungsweise
method_undefined
für dieses Modul aufgerufen. Wenn eine Singleton-Methode eines Objekts entfernt wird oder ihre Definition aufgehoben wird, dann wird die Methode
singleton_method_removed
beziehungsweise
singleton_method_undefined
für dieses Objekt aufgerufen.
    Und Sie sollten daran denken, dass sich die Methoden
method_missing
und
const_missing
, die in diesem Kapitel behandelt werden, auch wie Hook-Methoden verhalten.

8.6 Tracing
    Ruby definiert eine Reihe von Features, um die Ausführung eines Programms zu überwachen ( Tracing ). Sie sind hauptsächlich zur Fehlersuche im Code und zur Ausgabe informativer Fehlermeldungen geeignet. Zwei der einfachsten Features sind eigentlich Sprachschlüsselwörter:
__FILE__
and
__LINE__
. Diese Schlüsselwörter ergeben stets den Namen der Datei sowie die Nummer der Zeile innerhalb dieser Datei, in der sie stehen, und erlauben Fehlermeldungen die Angabe der genauen Stelle, an der sie erzeugt

Weitere Kostenlose Bücher