我利用最近几天深入研究了Clojure和ClojureScript中的clojure.spec。
到目前为止,我发现将规范用作公共函数中依赖于特定格式数据的:pre
和:post
守卫非常有用。
(defn person-name [person]
{:pre [(s/valid? ::person person)]
:post [(s/valid? string? %)]}
(str (::first-name person) " " (::last-name person)))
这种方法的问题在于,我得到了一个java.lang.AssertionError:Assert failed:(s/valid?::person person)
,但没有任何关于哪些具体规范没有被满足的信息。
有人有想法如何在:pre
或:post
守卫中获得更好的错误消息吗?
我知道conform
和explain*
,但那对于这些:pre
或:post
守卫没有帮助。
(defn f [x] {:pre [(s/assert string? x)]} (println x))
中使用 (失败的) s/assert 时,什么也没有发生。但是 s/explain 可以捕获它,所以对我来说没问题。(1.9.0-alpha13) - Anders Eriksson(s/assert string? x)
和(assert string? x)
(来自clojure.core)混淆了。后者需要写成(assert (string? x))
才能发挥作用。 - Anders Eriksson