2011-08-23 59 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") 

不知道如何适用,这将是你想要的东西。