请在 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
by
被选中 by
 
最佳答案

这看起来像是您将问题缩小到 spec-tools,而 clojure.spec.alpha 并不在这里造成问题。既然如此,我会在 spec-tools 的 GitHub 上发一个问题。

是的,但我认为即使 spec-tools 产生了无效的 spec,`valid?` 和 `explain` 在验证它时也应该保持一致,不是吗?
`spec-tools` 使用了 `spec.alpha` 的私有 API,因此有可能创建出看起来像 spec 但行为却很无常的东西。
我不知道这个。我会在那里报告它。
...