考虑以下规范
(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 规范是想要的并查找该规范。
在这种情况下,默认的“解释”消息很好,但其他 spec 打印器可能想要在使用户一步解决问题时提供提示。这在要求":req"时很容易做到,因为规范是全限制的,但在一般情况下对":req-un"则不可能。
一种解决方案是在上述“问题”数据中包括完全限定的规范和失败的谓词。