比较两个规格值,Clojure.spec

Compare between two specs values, Clojure.spec

我将规格定义为 -

(s/def ::start integer?)
(s/def ::end integer?)
(s/def ::collection (s/keys :req-un [::start ::end]))

工作正常 (s/valid? ::collection {:start 9 :end 13})

但现在我还必须检查 start 应该小于 end。怎么做?有没有更简单的方法来做到这一点而无需创建另一个 fn 和检查?

Spec 的 s/def 定义只是谓词。您可以在 ::collection 规范的正文中使用 s/and,其中第一个条件是您当前拥有的条件,第二个条件是顺序谓词:

(s/def ::ordered-collection (fn [{:keys [start end]}] (< start end)))

(s/def ::collection (s/and (s/keys :req-un [::start ::end])
                           ::ordered-collection))