2011-08-23 15 views
7

Defrecord, adlandırılmış parametreleri destekliyor mu?clojure defrecord parametreler denir?

(defrecord Person [name age]) 

Böyle bir şey yapabilir: Böyle bir şey varsa eğer yani

(Person. {:age 99 :name "bob"}) 
(Person. :age 99 :name "bob") 

Ben googling tarafından gördüğüm tek şey böyle şeyler:

(Person. "bob" 99) 

Hangi daha az açık görünüyor ...

+3

Clojure 1.3'te eklenen defrecord otomatik olarak, ör. map-> Kişi Bkz. http://dev.clojure.org/display/design/defrecord+improvements –

cevap

0

Şu an için yok.

Ama sadece parametreleri adlandırma unutup bir uzatma haritayı kullanabilirsiniz:

(defrecord Person []) 

(Person. nil {:age 99 :name "bob"}) 

Ben şahsen bu olası alanların çok sayıda olduğunda kayıtlarını kullanmak için en kolay yolu olarak görüyorum.

+0

tamam ... ama nil haritadan önce ne yapıyor? – Kevin

+0

İstediğiniz takdirde meta veriler için ...... – mikera

+0

teşekkürler, en mantıklı çözüm gibi göründüğü için bunu doğru cevap olarak işaretleyeceğim. – Kevin

4

inşa, ancak böyle bir şey kullanabilirsiniz Değil:

(defmulti make-instance (fn [class & rest] class)) 
(defmacro defrecord* [record-name fields] 
    `(do 
    (defrecord ~record-name ~fields) 
    (defmethod make-instance (quote ~record-name) [_# & {:keys ~fields}] 
     (new ~record-name [email protected])))) 
(defrecord* Person [name age]) 
(make-instance 'Person :age 99 :name "bob") 

istediğini olacağı da ne kadar uygun Emin değilim.