2024年Clojure状态调查 中分享您的想法!

欢迎!请查看关于页面,了解有关如何使用本页面的更多信息。

+2

重新标记

在specs alpha 2中,如果我们定义一个 clojure.alpha.spec/select,它是作为嵌套spec定义的 s/schema,而嵌套spec本身又是一个 s/schema(但使用未命名空间键),并且尝试使用它与 s/valid?s/exercise 结合使用,我们会得到异常
s/valid 抛出 *"No implementation of method: :conform of protocol: '#'clojure.alpha.spec.protocols/Spec found for class: clojure.lang.Keyword" error,而 s/exercise 抛出 "Unable to resolve 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在回答有关它的许多问题时所说的。

我原本预计 ::inner 的语法应为
(s/def ::inner (s/schema {:foo ::foo}))
基于维基文档,但这也不起作用(因此我回到了“它是Spec 2目前的许多错误之一”)。

by
可以确认,截至2020年8月24日(master分支的最新提交:d514b06b25c41a676b95afcc9bfac8ca34c5741e),此问题仍然存在于Spec2 alpha中。
by
我的解决方案是使用s/keys,直到方案稳定。
0
by
...