如果我们尝试向clojure.spec/keys
或clojure.spec/keys**
在命名参数:opt
或:opt-un
传递非关键字,我们将得到一个断言错误
`
(spec/valid? (spec/keys :opt ['a 5]) {})
;1. 由java.lang.AssertionError引发
; 断言失败:所有键都必须是命名空间限定的关键字
; (every? (fn* [p1__13667#] (c/and (keyword? p113667#) (namespace
; p113667#))) (concat req-keys req-un-specs opt opt-un))
(spec/valid? (spec/keys :opt-un ['a 5]) {}
;1. 由java.lang.AssertionError引发
; 断言失败:所有键都必须是命名空间限定的关键字
; (every? (fn [p1__13667#] (c/and (keyword? p113667#) (namespace
; p113667#))) (concat req-keys req-un-specs opt opt-un)))
`
但是,如果我们在命名参数:req
和:req-un
上做同样的事情,参数会被静默忽略,而对keys
的调用会返回一个没有任何要求的任何映射的规范
(spec/valid? (spec/keys :req ['a 5]) {}) => true (spec/valid? (spec/keys :req-un ['a 5]) {}) => true (spec/valid? (spec/keys* :req ['a 5]) {}) => true (spec/valid? (spec/keys* :req-un ['a 5]) {}) => true
对于:req(-un)?
参数抛出一个断言可能也是必须的。