2011-08-23 36 views
7

defrecord是否支持命名參數?也就是說,如果,如果我有這樣的事情:clojure defrecord命名參數?

(defrecord Person [name age]) 

我可以做這樣的事情:

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

我通過谷歌搜索看到的唯一事情是這樣的東西:

(Person. "bob" 99) 

哪似乎不太清楚......

+3

在Clojure 1.3中,defrecord自動創建了一個構造函數,它使用一個名爲例如地圖 - >人 請參閱http://dev.clojure.org/display/design/defrecord+improvements –

回答

0

當前不是。

但是你可以忘掉命名的參數和使用延長地圖:

(defrecord Person []) 

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

我個人覺得這是當你有大量的可能字段的使用記錄的最簡單的方法。

+0

好的......但是在地圖之前沒有做什麼? – Kevin

+0

這是元數據,如果你想要它...... – mikera

+0

謝謝,我將這標記爲正確的答案,因爲它似乎是最合理的解決方法。 – Kevin

4

不是內置的,但你可以使用類似:

(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") 

不知道如何適用,這將是你想要的東西。