Ich würde gerne nach Änderungen an verschiedenen Teilen einer Clojure-Hash-Map (Zugriff über eine STM-Referenz) suchen, die einen ziemlich großen Baum bildet, und bei Änderungen an diesen Teilen möchte ich einige registrierte Listener aufrufen. Wie kann ich das in clojure tun, wenn ich weiß, dass "add-watch" nur für eine ganze Referenz funktioniert?Wie kann ich eine Teilmenge eines Clojure-Baumes (Hash Map) für Änderungen beobachten?
Antwort
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.
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.
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.
ist, also sagen Sie, dass clojure add-watch nur an veränderlichen Strukturen funktioniert? – Zubair
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
- 1. Wie kann ich alle Änderungen innerhalb eines Untergraphen verfolgen/beobachten?
- 2. Beobachten einer Eigenschaft für Änderungen
- 3. Clojure: Wie wende ich eine Funktion auf eine Teilmenge der Einträge in einer Hash-Map an?
- 4. Beobachten NSPopupButton Änderungen
- 5. angularjs Beobachten rootscope Änderungen
- 6. Beobachten einer Variablen für Änderungen ohne Abfrage
- 7. Beobachten Ordner für Änderungen - bash Effizienz
- 8. Beobachten von NSMutableDictionary-Änderungen
- 9. WiFi/3G-Änderungen beobachten
- 10. Beobachten Sie ein Objektdiagramm für Änderungen
- 11. Ruby Hash Check ist Teilmenge?
- 12. VS debuggen und beobachten eine Variable für Änderungen
- 13. Map eine Teilmenge einer polymorphen Variante
- 14. Iterator für eine Teilmenge eines Vektors
- 15. Was ist eine gute Namenskonvention für eine Lookup Map/Hash?
- 16. Meteor Sammlung beobachten Änderungen rihtly
- 17. Wie kann man Änderungen im Verlauf des PHP-Skripts beobachten?
- 18. Wie kann ich den Inhalt einer Hash-Map ausgeben?
- 19. Rxjs Beobachten Objekt Updates und Änderungen
- 20. Beobachten für DOM-Änderungen, die elegante Art und Weise
- 21. Kann KVO Änderungen in einem UIView Subview Array beobachten?
- 22. Angular beobachten für Änderungen in $ http.pendingRequests aus Direktive
- 23. Wie kann man Änderungen in einem Array von Objekten beobachten, ohne eine massive Verzögerung zu verursachen?
- 24. Wie wähle ich eine Teilmenge eines Arrays in Postgres?
- 25. Java 8 Hash Map
- 26. Ein Verzeichnis nach Änderungen in Java beobachten
- 27. Wie kann ich eine Teilmenge eines Wörterbuchs in eine andere in C# extrahieren?
- 28. Einfügen in eine gleichzeitige Hash-Map
- 29. Serverfunktion Aufruf am Dokument Änderungen beobachten
- 30. Gibt es eine Möglichkeit, eine MySQL-Datenbank für Änderungen mit Perl zu beobachten?
Sorry, ich meinte, wie man auf partielle Änderungen achten kann, wenn der Baum eine Ref – Zubair