这与许多其他问题/票证相关,但我还没有找到关于特定于此的。
因为 :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
时,该不变性被违反。
要合并它们,您需要先构建映射,然后 opts (conj defaults-map opts)
,但这需要再次遍历键/符号/字符串,仅选择 :or
映射中的名称,并需要创建另一个映射,或者反复调用 assoc
。
我认为是可行的,但这需要一点麻烦来编写。