包含错误值的集合的 Clojure 规范

Rov*_*ion 1 clojure clojure.spec

由于某种原因,下面的规范确实表明它false不是有效的::a-thing,即使它是给定集合的一部分。

(require '[clojure.spec.alpha :as spec])

(spec/def ::a-thing #{:a :b :c false})

(spec/valid? ::a-thing :a)     ; => true
(spec/valid? ::a-thing :d)     ; => false
(spec/valid? ::a-thing false)  ; => false
Run Code Online (Sandbox Code Playgroud)

Thu*_*ail 5

这与 无关spec,而与集合作为​​函数的行为方式有关。每当您使用集合作为函数来测试成员资格时,您都会遇到类似的误解。

当您传递spec一个函数时,它会将其用作谓词。集合是函数,任何其他实现clojure.lang.IFn. 作为函数,集合的行为就像其成员的恒等式一样。其他一切都随之而来。绝对不会对集合进行特殊处理spec