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

欢迎!请参阅关于页面,了解更多关于本站是如何运作的信息。

0
Spec

当使用spec-tools (metosin/spec-tools {:mvn/version "0.10.5"})来规范一个值列表时,结果规范在s/valid?和s/explain的验证中产生了不一致的结果。

最小示例:

(ns case
  (:require [spec-tools.data-spec :as ds]
            [clojure.spec.alpha :as s]))

(def invalid-data {:cards (list 66)})

(def valid-data {:cards [66]})

(def cards
  {:cards [int?]})

(defn do-stuff [data]
  (if (s/valid? (ds/spec ::sp cards) data)
    (println "Conforms to spec according to 'valid?'")
    (println "Does not conform to spec according to 'valid?'"))
  (if (s/explain-data (ds/spec ::sp cards) data)
    (println "Does not conform to spec according to 'explain-data'")
    (println "Conforms to spec according to 'explain-data'")))

(comment
  (do-stuff invalid-data)
  (do-stuff valid-data))

不知何种原因,当使用列表时,s/valid?和s/explain会产生不同的结果,但当使用向量时,它们的会相同。当我尝试使用clojure.spec.alpha直接创建spec来重现这个问题时,一切正常,所以问题似乎在于spec-tools。尽管如此,我猜测所有验证函数都应该产生相同的结果。

1 个答案

+1

已选择
 
最佳答案

看起来您已经将问题缩小到spec-tools,并且clojure.spec.alpha在这里并没有问题。给定这一点,我会将问题提交给spec-tools的GitHub。

是的,但我想即使spec-tools生成无效spec,当对其进行验证时,`valid?` 和 `explain` 是否仍然应该是一致的?
`spec-tools` 使用 `spec.alpha` 的私有API,因此有可能创建出看似规范但实际上行为不规律的东西。
我不知道这一点。我会在那里报告这个问题。
...