Clojure - Beobachter
Watcherssind Funktionen, die Variablentypen wie Atomen und Referenzvariablen hinzugefügt werden und aufgerufen werden, wenn sich ein Wert des Variablentyps ändert. Wenn das aufrufende Programm beispielsweise den Wert einer Atomvariablen ändert und eine Überwachungsfunktion an die Atomvariable angehängt ist, wird die Funktion aufgerufen, sobald der Wert des Atoms geändert wird.
Die folgenden Funktionen sind in Clojure for Watchers verfügbar.
Add-Watch
Fügt einer Agent / Atom / Var / Ref-Referenz eine Überwachungsfunktion hinzu. Die Uhr‘fn’muss ein 'fn' von 4 Argumenten sein: ein Schlüssel, die Referenz, sein alter Zustand, sein neuer Zustand. Wann immer der Status der Referenz geändert wurde, werden die Funktionen registrierter Uhren aufgerufen.
Syntax
Es folgt die Syntax.
(add-watch variable :watcher
(fn [key variable-type old-state new-state]))
Parameters- 'Variable' ist der Name des Atoms oder der Referenzvariablen. 'Variablentyp' ist der Variablentyp, entweder Atom- oder Referenzvariable. 'alter Zustand & neuer Zustand' sind Parameter, die automatisch den alten und neuen Wert der Variablen enthalten. 'key' muss pro Referenz eindeutig sein und kann verwendet werden, um die Uhr mit remove-watch zu entfernen.
Return Value - Keine.
Beispiel
Ein Beispiel für die Verwendung wird im folgenden Programm gezeigt.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def x (atom 0))
(add-watch x :watcher
(fn [key atom old-state new-state]
(println "The value of the atom has been changed")
(println "old-state" old-state)
(println "new-state" new-state)))
(reset! x 2))
(Example)
Ausgabe
Das obige Programm erzeugt die folgende Ausgabe.
The value of the atom has been changed
old-state 0
new-state 2
Uhr entfernen
Entfernt eine Uhr, die an eine Referenzvariable angehängt wurde.
Syntax
Es folgt die Syntax.
(remove-watch variable watchname)
Parameters- 'Variable' ist der Name des Atoms oder der Referenzvariablen. 'watchname' ist der Name, der der Uhr gegeben wird, wenn die Überwachungsfunktion definiert wird.
Return Value - Keine.
Beispiel
Ein Beispiel für die Verwendung wird im folgenden Programm gezeigt.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(def x (atom 0))
(add-watch x :watcher
(fn [key atom old-state new-state]
(println "The value of the atom has been changed")
(println "old-state" old-state)
(println "new-state" new-state)))
(reset! x 2)
(remove-watch x :watcher)
(reset! x 4))
(Example)
Ausgabe
Das obige Programm erzeugt die folgende Ausgabe.
The value of the atom has been changed
old-state 0
new-state 2
Aus dem obigen Programm können Sie deutlich erkennen, dass der zweite Rücksetzbefehl den Watcher nicht auslöst, da er aus der Watcher-Liste entfernt wurde.