deftype
domyślnie nadal mamy niezmienne pola; aby to zmienić, musisz zanotować nazwy pól, które mają być modyfikowane za pomocą odpowiednich metadanych. Również składnia dla pól instancji set!
jest inna. Przykładem wdrożenia do powyższych prac:
(deftype Point [^{:volatile-mutable true} x]
IPoint
(getX [_] x)
(setX [this v] (set! x v)))
Jest też :unsynchronized-mutable
. Różnica polega na tym, że nazwy sugerowałyby doświadczonemu programistom Java. ;-) Zauważ, że dostarczanie albo adnotację ma dodatkowy efekt dokonywania pole prywatny, więc bezpośredni dostęp pole nie jest już możliwe:
(.getX (Point. 10)) ; still works
(.x (Point. 10)) ; with annotations -- IllegalArgumentException, works without
Również 1.2 będzie prawdopodobnie wspierać składni ^:volatile-mutable x
jako skrót dla ^{:volatile-mutable true} x
(ta jest już dostępny w niektórych nowych gałęziach numerycznych).
Obie opcje są wymienione w (doc deftype)
; Odpowiednia część następuje - pamiętaj napomnienie!
Pola mogą być zakwalifikowane z metadanych: lotny-zmienny prawda czy: rozsynchronizowany-zmienny prawda, w tym momencie (set nią Aval!) Będą wspierane w sposób ciał. Zwróć uwagę, że pola zmienne są bardzo trudne w użyciu i są bardzo trudne w użyciu i są dostępne tylko po to, aby ułatwić budowanie wyższych konstrukcji poziomu, takich jak typy odniesienia Clojure, w Clojure . Są one przeznaczone wyłącznie dla ekspertów - jeśli semantyka i implikacje: volatile-mutable lub: unsynchronized-mutable nie są natychmiast widoczne, nie powinieneś ich używać.
Dzięki. Jesteś kopalnią informacji, cieszę się, że cię tu masz :) –
Miło z twojej strony, że tak mówię, dzięki. :-) –
Chcę podkreślić ... znowu ... "nie powinieneś ich używać". Nie używaj: volatile-mutable i: unsynchronized-mutable. Chyba, że już wiesz, to ostrzeżenie nie dotyczy Ciebie i nie rozumiem, dlaczego ponownie ostrzegam ;-) – Jason