deftype
Standard ist immer noch die Felder unveränderlich zu haben; Um dies zu überschreiben, müssen Sie die Namen der Felder kommentieren, die mit geeigneten Metadaten veränderbar sein sollen. Außerdem ist die Syntax für Instanzfelder set!
unterschiedlich. Eine beispielhafte Implementierung der obigen Arbeit zu machen:
(deftype Point [^{:volatile-mutable true} x]
IPoint
(getX [_] x)
(setX [this v] (set! x v)))
gibt es auch :unsynchronized-mutable
. Der Unterschied ist, wie die Namen einem erfahrenen Java-Entwickler nahelegen würden. ;-) Beachten Sie, dass das Feld privat machen entweder Annotation hat den zusätzlichen Effekt bereitstellt, so dass ein direkter Zugang Feld nicht mehr möglich ist:
(.getX (Point. 10)) ; still works
(.x (Point. 10)) ; with annotations -- IllegalArgumentException, works without
Auch wird, 1.2 unterstützen wahrscheinlich die Syntax ^:volatile-mutable x
als Abkürzung für ^{:volatile-mutable true} x
(dies ist bereits für einige der neuen Numerikzweige verfügbar).
Beide Optionen sind in (doc deftype)
erwähnt; der relevante Teil folgt - beachten Sie die Ermahnung!
Felder können mit den Metadaten zu qualifizieren: volatile-wandelbar wahr oder: unsynchronisierte-wandelbar wahr, an welcher Stelle (Set afield Aval!) Wird in Verfahren Gremien unterstützt. Beachten Sie, dass veränderbare Felder extrem schwierig zu verwenden richtig sind, und nur vorhanden sind, um das Erstellen von höheren Level-Konstrukte, wie Clojure-Referenztypen, in Clojure selbst zu erleichtern. Sie sind nur für Experten - wenn die Semantik und Implikationen von: volatile-mutable oder: unsynchronized-mutable nicht sofort ersichtlich sind, sollten Sie sie nicht verwenden.
Danke. Sie sind eine Goldgrube von Informationen, froh, Sie hier zu haben :) –
Schön von Ihnen zu sagen, danke. :-) –
Ich möchte betonen ... wieder ... "du solltest sie nicht benutzen". Verwenden Sie nicht: volatile-mutable und: unsynchronized-mutable. Sofern Sie nicht bereits wissen, dass diese Warnung nicht auf Sie zutrifft und Sie verstehen, warum ich die Warnung nochmals sage ;-) – Jason