请在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-tools 的问题。

1 个答案

+1

选择
 
最佳答案

是的,由于几个原因,这是默认行为 — 首先,map 键通常是简单值 - 关键词、字符串、长整数,规范值与它们相同,其次,如果您不需要它,不这样做会更好。

虽然如此,但您可以使用:conform-keys true来请求它,这在map-of文档字符串中有说明。https://clojure.github.io/spec.alpha/clojure.spec.alpha-api.html#clojure.spec.alpha/map-of

在这个情况下,`s/unform` 是否应该支持非符合值?
这是一个好问题,看起来是的,所以我同意这看起来是错误的。我不记得有关于这个的工单,但可能有一个。
谢谢Alex!
...