使用 s/assert 代替 assert 有优势:即数据未满足规范的具体原因。但这也存在缺点:错误信息不包含用户编写的断言代码,因此更难看到哪个断言失败。
我相信,如果 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))
`