请在2024 Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面了解该 sitio 更多信息。

0
Spec

如果我想执行

(s/conform
 (s/map-of (s/or :keyword keyword? :string string?) any?)
 {:a 1})

我得到了

{:a 1}

而不是

{[:keyword :a] 1}

这是预期的吗?

这的一个后果是,如果我尝试进行s/unform

(s/unform
 (s/map-of (s/or :keyword keyword? :string string?) any?)
 {:a 1})

我会遇到异常,因为:a不是s/or的有效合规值。

我用spec-tools遇到了这个问题。它的explain-data实现调用了s/unformhttps://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`应该支持不符 sightings的值吗?
这是一个好问题,看起来是的,所以我同意这似乎是错误的。我不记得有关于这个问题的票据,但可能有个。
谢谢Alex!
...