2024 Clojure调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
Spec

如果我们尝试将非关键字传递到命名参数 :opt:opt-un 上的 clojure.spec/keysclojure.spec/keys**,我们将收到一个断言错误

`
(spec/valid? (spec/keys :opt ['a 5]) {})
;1. 由java.lang.AssertionError引起
;断言失败:所有键都必须是命名空间限定的关键字
; (every? (fn* [p1__13667#] (c/and (keyword? p113667#) (namespace
; p1
13667#))) (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
; p1
13667#))) (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)? 参数抛出一个断言。

1 答案

0
参考:https://clojure.atlassian.net/browse/CLJ-2154(由rovanion报告)
...