Clojure Unterschiede zwischen Ref, Var, Agent, Atom, mit Beispielen
Ich bin sehr neu in Clojure, Können Sie Jungs geben mir die Erklärung mit der realen Welt Szenarien. Ich meine, wo zu verwenden, Ref, Var, Agent, Atom. Ich lese Buch, aber konnte immer noch nicht verstehen, die Beispiele aus der Praxis.
InformationsquelleAutor der Frage | 2012-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Empfehle ich "The Joy of Clojure" oder "programming Clojure" für eine wirkliche Antwort auf diese Frage kann ich reproduzieren einen kurzen snip-it die Beweggründe für jeden:
starten Sie durch die Beobachtung in diesem video auf den Begriff der Identität und/oder hier studieren.
Koordiniert Zugriff verwendet wird, wenn zwei Identitäten sich ändern muss zusammen, das klassische Beispiel ist das verschieben von Geld von einem Bankkonto auf ein anderes, muss es entweder komplett umziehen oder gar nicht.
Unkoordiniert Zugriff verwendet wird, wenn nur eine Identität braucht, um zu aktualisieren, dies ist ein sehr häufiger Fall.
Synchrone Zugriff verwendet wird, wenn der Anruf erwartet wird, zu warten, bis alle Identitäten angesiedelt haben, bevor Sie fortfahren.
Asynchron Zugriff "Feuer-und-vergessen" und lassen Sie die Identität erreichen Ihre neuen Staat in seiner eigenen Zeit.
InformationsquelleAutor der Antwort Arthur Ulfeldt
Refs sind für den Staat, der synchronisiert werden muss zwischen threads. Wenn Sie brauchen, um zu verfolgen eine Reihe von verschiedenen Dingen, und Sie wird manchmal tun müssen, Vorgänge, die schreiben, um mehrere Dinge auf einmal, verwenden Sie refs. Jedes mal, wenn Sie haben mehrere verschiedene Teile des Staates, den Einsatz von refs ist keine schlechte Idee.
Atome sind für den unabhängigen Staat, der synchronisiert werden muss zwischen threads. Wenn Sie nie brauchen, um zu ändern den Zustand des atoms und etwas anderes zur gleichen Zeit, bei atom ist sicher (insbesondere, wenn es nur ein Stück Staat in das gesamte Programm, Sie können es in einem atom). Als nicht-triviales Beispiel, wenn Sie versuchen, die cache die Rückgabewerte einer Funktion (dh memoize es), indem ein atom ist wohl sicher - der Staat ist unsichtbar für alles, was außerhalb der Funktion, so dass Sie nicht brauchen, um über einen Zustand zu ändern, in der Funktion beinahe nichts nach.
Agenten primäre Punkt ist, dass Sie die Ausführung in einem anderen thread. Sie können den Wert abrufen, der agent und sagen Sie es anwenden einer Funktion auf Ihren Wert, aber Sie wissen nicht, Wann die Funktion ausgeführt wird oder welchen Wert die Funktion angewendet wird.
Vars sind für, wenn Sie benötigen, zu speichern, etwas auf einer pro-thread-basis. Wenn Sie ein multi-threaded Programm und jeder thread braucht seinen eigenen Staat stellen, dass der Staat in einer var.
Soweit real-world-Beispiele gehen, wenn Sie ein Beispiel geben, was Sie zu tun versuchen, können wir Ihnen sagen, was zu verwenden.
InformationsquelleAutor der Antwort Retief
Wenn ich zuerst Lesen Sie mehr über diese Typen, ich habe auch gekämpft, um zu verstehen, wo ich sein könnte oder sollte einen hier also mein Klartext Antwort:
Verwendung eines var-wenn die Daten nicht ändern. Dies geschieht immer dann, wenn Sie
def
oder die meisten Funktionen, die beginnen mitdef
wiedefn
.Verwenden Sie ein atom, wenn man ein Element ändert. Ein Beispiel könnte sein, einen Zähler oder einen Vektor, der Sie Elemente hinzufügen möchten.
Verwenden Sie ein ref, wenn Sie zwei oder mehr Dinge, die sich ändern müssen in der gleichen Zeit. Denken Sie "Datenbank-Transaktionen", wenn Sie vertraut sind. Das kanonische Beispiel ist die übertragung von Geld von einem Konto auf ein anderes. Jedes Konto gespeichert werden kann in einen ref, so dass änderungen vorgenommen werden können, erscheinen atomic.
Verwenden Sie einen Agenten, wenn Sie möchten, etwas zu ändern, aber Sie kümmern sich nicht wenn. Dies könnte eine lange Berechnung oder etwas zu schreiben, um eine Datei oder ein socket. Beachten Sie, dass mit der letzteren, die Sie verwenden sollten
send-off
.Hinweis: ich Schätze, dass es eine ganze Menge mehr zu jeder von diesen aber hoffentlich dies sollte Ihnen einen Ausgangspunkt.
InformationsquelleAutor der Antwort optevo
Schrieb ich Artikel mit der Zusammenfassung bis der Unterschied zwischen Ihnen und helfen, wählen Sie, wenn zu verwenden.
Anteil Staat - wenn use vars, atoms, Agenten und refs?
Ich hoffe, es wird helfen, Menschen auf der Suche Antworten in diesem Thema.
Einige Verknüpfung der Artikel nach @tunaci Vorschlag:
Vars
Atome
Agenten
Refs
- Und Flussdiagramm-Wann verwenden Sie welche:
Bitte schauen Sie sich das Bild auf der website, da einige updates sind immer möglich.
Es ist Komplex und ein langes Thema zu geben, die volle Antwort, ohne copy & past Artikel, also bitte verzeihen Sie mir, ich leiten Sie auf website 🙂
InformationsquelleAutor der Antwort kabra
atoms, refs und Agenten - illumination hier
http://blog.jayfields.com/2011/04/clojure-state-management.html
InformationsquelleAutor der Antwort Gokul