defrecord是否支持命名参数?即如果我有这样的东西:
(defrecord Person [name age])
我可以这样做:
(Person. {:age 99 :name "bob"})
(Person. :age 99 :name "bob")
我通过谷歌搜索看到的唯一一件事就是这样:
(Person. "bob" 99)
这似乎不太清楚......
答案 0 :(得分: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 ~@fields))))
(defrecord* Person [name age])
(make-instance 'Person :age 99 :name "bob")
不确定你想要的是多么合适。
答案 1 :(得分:2)
clojure似乎还没有支持这个?
http://david-mcneil.com/post/765563763/enhanced-clojure-records
答案 2 :(得分:0)
目前不是。
但是你可以忘记命名参数并使用扩展名映射:
(defrecord Person [])
(Person. nil {:age 99 :name "bob"})
我个人认为,当你有大量可能的字段时,这是使用记录的最简单方法。