这与许多其他问题/问题单有关,但是我还没有找到专门针对这个问题的一个。
因为 :or
被解构到 not-found
值的 get
调用中,对解构的键/符号等进行解构,如果在 :as
中绑定对象并包括 :or
中的默认值,则对象将不会有默认值
(defn example [{:keys [a b]
:or {a 1 b 2}
:as opts}]
(println a b opts))
(example {:a 5})
;=> 5 2 {:a 5}
这导致了我们代码库中的微妙错误,我们原本期望有默认值,但它们却不存在,或者我们使用了 {:pre [some-pred]}
来检查一个自律,而我们修改函数以使用 :as
以及特定值时,这个自律被违反了。
为了合并它们,您需要先构建映射,然后 opts (conj defaults-map opts)
,但这需要再次遍历键/符号/字符串,只选择 :or
映射中的名称,并且需要创建另一个映射,或者可能反复调用 assoc
。
我认为这是可行的,只是书写起来有些麻烦。