请在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!
...