请在2024年 Clojure 状况调查中分享您的想法!

欢迎!请查看关于页面,了解有关如何操作的一些更多信息。

0投票
Spec

如果我运行

(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 的问题。

1 答案

+1投票

被选中
 
最佳回答

是的,出于几个原因,这是默认行为 - 首先,映射键通常是简单值 - 关键字、字符串、长整型等,其符合值是相同的,其次,如果不必要,这样做可以提升性能。

不过,如果您需要,可以通过 :conform-keys true 来请求这一点,如 map-of 的文档字符串中所述。(https://clojure.github.io/spec.alpha/clojure.spec.alpha-api.html#clojure.spec.alpha/map-of)

作者是
在这种情况下,`s/unform` 应该支持非符合值吗?
作者是
这是个好问题,看起来应该是这样,所以我同意这似乎错了。我不记得有关于这个的工单,但也许有。
作者是
感谢Alex!
...