在记录构造函数中默认值



我不太了解

有什么问题
(defrecord Person [name age])
(defn make-person [& opts]
  (let [defaults {:age 18}]
    (map->Person (merge defaults opts))))
(make-person {:name "Jim"})
=> ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.util.Map$Entry  clojure.lang.APersistentMap.cons (APersistentMap.java:42)

如果我这样做: (map-> person(Merge {:age 18} {:名称" jim"}))

i还可以使make-person函数与非可选参数一起使用。

(defn make-person [opts]      
  (let [defaults {:age 18}]
    (map->Person (merge defaults opts))))

我已经解决了我想做的事情的解决方案,例如:

(defn make-person
  ([opts] (map->Person (merge {:age 18} opts)))
  ([] (map->Person {:age 18})))

所以我想我在问,&在破坏函数参数时真正做什么?

& opts返回序列,如果您通过地图。

,这是有问题的。

您可能想破坏类似的序列:

(defn make-person [& [opts]]
   (map->Person (merge {:age 18} opts))

可以让您进行(make-person)(make-person {:opt1 "foo" :opt2 "bar"})

您可以利用特殊的语法来允许关键字args:

(defn make-person [ & {:as opts} ]
   (map->Person (merge {:age 18} opts))

允许您进行(make-person :opt1 "foo" :opt2 "bar"),但是根据我的经验,如果您想在呼叫之外进行合并(即有一天您会),请致电make-person(即,如果您想要(make-person (merge some-opts some-other-opts)

最新更新