这与许多其他问题/ Jira 工单有关,但我没有找到专门针对此问题的。
因为:or
会被解构成键/符号等的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
。
我认为这是可行的,但写起来可能会有些麻烦。