考虑以下规范
(s/def :example/name string?)
(s/def :example/age pos-int?)
(s/def :wine/age (s/and pos-int?
#(< 100)))
(s/def :example/employee (s/keys
:req [:example/string]
:req-un [:example/age]))
(s/explain-data :example/employee {})
;; #:clojure.spec.alpha{:problems ({:path [], :pred (clojure.core/fn [%] (clojure.core/contains? % :example/string)), :val {}, :via [:example/employee], :in []} {:path [], :pred (clojure.core/fn [%] (clojure.core/contains? % :age)), :val {}, :via [:example/employee], :in []}), :spec :example/employee, :value {}}
在这个例子中,explain-data确实给出了精确的问题:映射需要键。但用户需要执行至少两个步骤来解决问题:“:age”:添加某些虚拟值以解决需要键的問題并查看新的explain-data,或者猜测预期的:age规范并查找规范。
在这种情况下,默认的"explain"消息非常好,但其他规范打印器可能希望向用户提供有关如何一步解决此问题的提示。在":req"的情况下,这是容易的,因为规范是完全限定的,但对于":req-un"通常不可能。
一种解决方案是将完全限定的规范以及上面的失败的谓词与"problem"数据一起包含在内。