2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面了解本网站的更多操作信息。

0投票
规范

如果我运行

(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文档字符串所述。请参阅此处

在那个情况下,应该`s/unform`支持不符合的值吗?
这是一个好问题,看起来是的,因此我同意这看起来不正确。我不记得有一个关于这个的票据,但可能有一个。
谢谢Alex!
...