这与许多其他问题/Jira工单相关,但我还没有找到针对这个特定问题的工单。
因为`: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`。
我认为这是可行的,但编写起来会有些烦恼。