使用 s/assert 而不是 assert 具有优点:即数据未能满足 spec 的具体原因。但同时也存在缺点:错误消息不包含用户编写的断言代码,因此更难看到哪个断言失败。
我相信,如果我们能在 s/assert 中包含原始的 "assert" 代码,我们就能拥有两者的最佳之处——这样,错误消息就可以(可选地)打印出此信息。
`
(require '[clojure.spec.alpha :as s])
(s/check-asserts true)
(let [x 1]
(s/assert string? x))
;; Spec 断言失败 val: 1 失败
;; :clojure.spec.alpha/unknown
(let [x 1]
(assert (string? x)))
;; 断言失败: (string? x)
`