2010-06-28 11 views
19

Ben Clojure 1.2, clojure.org documentation göre deftype desteklenir özellikle değişken alanları çalışıyorum.Clojure deftype'da değişken alanlar?

Ama seti işe alınamıyor. Bir alanı güncellemek için sözdizimi nedir? Yoksa mutability henüz uygulanmadı mı?

(definterface IPoint 
    (getX []) 
    (setX [v])) 

(deftype Point [x] 
    IPoint 
    (getX [this] x) 
    (setX [this v] (set! (.x this) v))) 

user=> (def p (Point. 10)) 
user=> (.getX p) 
10 
user=> (.setX p 20) 
ClassCastException: user.Point cannot be cast to compile__stub.user.Point 

Birkaç gün önce 1.2 snapshot kullanarak.

cevap

40

deftype bireyin varsayılan alanları değişmez olmak için hala olduğu; Bunu geçersiz kılmak için uygun meta verilerle değiştirilebilecek alanların adlarına açıklama eklemeniz gerekir. Ayrıca, örnek alanların set! sözdizimi farklıdır. Ayrıca :unsynchronized-mutable var

(deftype Point [^{:volatile-mutable true} x] 
    IPoint 
    (getX [_] x) 
    (setX [this v] (set! x v))) 

: Bir örnek uygulama yukarıda çalışması için. Fark, isimlerin deneyimli bir Java geliştiricisine önerdiği gibi. Doğrudan alan erişim artık mümkün böylece ;-), ek açıklama ya sağlayarak alan özel yapmanın ilave bir etkisi olmadığını unutmayın:

(.getX (Point. 10)) ; still works 
(.x (Point. 10)) ; with annotations -- IllegalArgumentException, works without 

Ayrıca, 1.2 olasılıkla (^{:volatile-mutable true} x için kısaltma olarak bu sözdizimini ^:volatile-mutable x destekleyecek bazı yeni sayısal dallarda zaten mevcuttur).

Her iki seçenek (doc deftype) olarak söz edilir; ilgili bölüm aşağıdakileri izler; meta ile

Sahası nitelikli olabilir : yöntem organları desteklenecek olan alanına (mesafelere Aval set!) de, senkronize olmayan-kesilebilir doğru: Gerçek uçucu kesilebilir veya. Kesilebilir alanların doğru kullanımı son derece zordur ve Clojure kendisi, örneğin Clojure referans türleri gibi yüksek seviye yapıları, bina kolaylaştırmak üzere, sadece mevcut olduğu da not edin. Onlar sadece uzmanlar içindir - semantik ve etkileri ise: uçucu-değişken veya: unsynchronized-değişken size hemen belli değildir, sen bunları kullanarak edilmemelidir.

+2

teşekkürler. Sen bunu söylemek burada :) –

+0

Nice'i görmekten memnuniyet bilgi hazinesidir, teşekkürler konum. :-) –

+0

Vurgulamak istiyorum ... tekrar ... "kullanmamanız gerekir". Kullanmayın: uçucu-mutable ve: senkronize olmayan-mutable. Zaten bilmiyorsanız, bu uyarı sizin için geçerli değildir ve neden uyarıyı tekrar belirttiğimi anlıyor ;-) – Jason