2011-01-02 2 views

Antwort

1

Ich würde auch den ganzen Baum beobachten und Subsets mit Get-In überprüfen. Sie können schnell testen, ob der Teilbaum geändert wurde, indem Sie einen identischen? Test gegen den vorherigen Zustand. So etwas wie

(defn change-tester [tree path] 
    (let [orig (get-in tree path)] 
    (fn [tree] 
     (not (identical? (get-in tree path) orig))))) 

Ich Beobachter nicht sehr oft verwenden, so weiß ich nicht, die Syntax, aber man konnte die obige Funktion irgendwie befestigen, ich bin sicher.

2

Da Clojure-Maps unveränderlich sind, gibt es aus konzeptueller Sicht nicht wirklich eine Änderung an einem einzelnen Teil eines Baumes.

ich aber ein paar gute Optionen sehen:

  • hinzufügen eine Uhr für den gesamten Baum, sondern prüfen, ob die jeweilige Teil sind Sie interessiert hat sich geändert. Dies sollte ziemlich schnell und einfach zu testen sein (verwenden Sie "Get-In", um den rechten Teil des Baumes nachzuschlagen)
  • Marshall ändert sich in den Baum durch eine Bibliothek von Hilfsfunktionen, die die Art von Änderungen abfangen können sind interessiert an.
+0

Sorry, ich meinte, wie man auf partielle Änderungen achten kann, wenn der Baum eine Ref – Zubair

1

Clojure Karten sind unveränderlich was bedeutet, dass sie auch Thread sicher sind, was eine gute Sache ist. Wenn Sie eine mit 'assoc' oder ähnlichem ändern, erstellen Sie eine neue Kopie, in der Ihre geänderten Werte vorhanden sind. (Beachten Sie, dass eine vollständige Kopie nicht erstellt wird, sondern eine effiziente Technik zum Erstellen einer Kopie verwendet wird.)

Ich denke, der beste Weg zu tun, was Sie wollen, ist Ihre eigene Datenstruktur zu erstellen, weil im Wesentlichen was Du verlangst eine veränderbare HashMap wie in Java, aber keine Clojure Map.

Sie könnten einen Wrapper um eine vorhandene Java HashMap erstellen, der die Methoden 'put' und 'putAll' außer Kraft setzt, damit Sie erkennen können, was geändert wird. Wenn Sie eine HashMap innerhalb einer HashMap haben, möchten Sie, dass die Sub-HashMap auch von Ihrem neuen Typ ist, so dass Sie Änderungen auf jeder Ebene erkennen können.

Sie könnten es so etwas wie "WatchfulHashMap" nennen. Dann werden Sie eine Instanz dieses neuen HashMap zu schaffen wie:

(def m (ref (WatchfulHashMap.))) 

So eine einzelne Instanz davon modifizierbar von überall in Ihrer Anwendung zu machen.

+0

ist, also sagen Sie, dass clojure add-watch nur an veränderlichen Strukturen funktioniert? – Zubair

+0

Nein, sie arbeiten an Refs. Wenn Sie den 'add-watch'-Ansatz verwenden, scheint es, als würden Sie für jeden Knoten in der Struktur oder für eine Überwachung, die den alten und den neuen Zustand der Struktur unterscheidet, gezwungen sein, die Funktion "Hinzufügen" hinzuzufügen. – Psyllo

Verwandte Themen