这与其他若干请求/票据有关,但我还没有找到专门针对此问题的。
因为 :or
被解构为 get
调用的 not-found
值,对解构的键/符号等进行处理,如果你用 :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
以及特定的值时,这个不变量被违反。
要合并它们,你想要构建一个map,然后执行 opts (conj defaults-map opts)
,但这需要第二次遍历键/syms/strs,选择仅存在于 :or
map中的名称,需要创建另一个map,或者可能多次调用 assoc
。
我认为这是可行的,只是写起来可能有些繁琐。