请在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/unform
 (s/map-of (s/or :keyword keyword? :string string?) any?)
 {:a 1})

我得到一个异常,因为:a不是s/or的有效格式化值。

我在使用spec-tools时遇到了这个问题。它的解释数据实现调用了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

by
在那种情况下`s/unform`应该支持非符合值吗?
by
这是一个很好的问题,似乎是的,所以我同意这似乎是错误的。我不记得有这个问题的票据,但可能有一个。
by
谢谢Alex!
...