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

欢迎!请查阅关于页面以了解更多此网站的详细信息。

+2

重新标记

在specs alpha 2中,如果我们定义一个作为嵌套spec(其本身也是schema)的s/schema并且使用未命名空间键,然后尝试用s/valid?或s/exercise使用它,我们会遇到异常
s/valid 抛出“没有找到类:clojure.lang.Keyword实现的协议:'clojure.alpha.spec.protocols/Spec的方法”错误,而s/exercise 抛出“无法解析spec::foo”(其中::foo 是未命名空间键)

一个例子可以更好地说明问题

; Context
(s/def ::foo int?)
(s/def ::inner (s/schema [{:foo ::foo}]))
(s/def ::outer (s/schema [::inner]))

; Works as expected:
(s/exercise ::outer)
(s/exercise (s/select ::inner [*]))
(s/valid? (s/select ::inner [*]) {:foo 10})

; Fails with "Unable to resolve spec: :foo"
(s/exercise (s/select ::outer [*]))

; Fails with "No implementation of method: :conform* of protocol: #'clojure.alpha.spec.protocols/Spec found for class: clojure.lang.Keyword"
(s/valid? (s/select ::outer [*]) {::inner {:foo 10}})

2 答案

+1

我的第一反应是"Spec 2还没有准备好使用,并且有很多错误",正如Alex在回答大多数关于Spec 2的问题时所说。

根据Wiki文档,我预计::inner的语法应该是
(s/def ::inner (s/schema {:foo ::foo}))
但这同样不起作用(所以我又回到了“它现在是Spec 2中许多错误中的一个”)。

确认该问题仍然存在于Spec2 alpha版本中,截至2020-08-24(master分支的最新提交:d514b06b25c41a676b95afcc9bfac8ca34c5741e)。
我的解决办法是使用s/keys直到架构稳定。
0 投票
...