欢迎!请查看关于页面,了解有关如何操作的一些更多信息。
如果我运行
(s/conform (s/map-of (s/or :keyword keyword? :string string?) any?) {:a 1})
我得到了
{:a 1}
而不是
{[:keyword :a] 1}
预期是这样的吗?
这一点的一个后果是,如果我尝试
(s/unform (s/map-of (s/or :keyword keyword? :string string?) any?) {:a 1})
我得到了一个异常,因为`:a`不是`s/or`的有效符合值。
我在使用 spec-tools 时遇到了这个问题。它的 explain-data 实现将 s/unform 调用(https://github.com/metosin/spec-tools/blob/master/src/spec_tools/core.cljc#L446)。我正在尝试弄清楚这是 spec 还是 spec-tools 的问题。
是的,出于几个原因,这是默认行为 - 首先,映射键通常是简单值 - 关键字、字符串、长整型等,其符合值是相同的,其次,如果不必要,这样做可以提升性能。
不过,如果您需要,可以通过 :conform-keys true 来请求这一点,如 map-of 的文档字符串中所述。(https://clojure.github.io/spec.alpha/clojure.spec.alpha-api.html#clojure.spec.alpha/map-of)
:conform-keys true