我不太了解
有什么问题(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)