如果我们尝试将非关键字传递到命名参数 :opt
或 :opt-un
上的 clojure.spec/keys
或 clojure.spec/keys**
,我们将收到一个断言错误
`
(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
(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)?
参数抛出一个断言。