2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅关于页面了解有关如何使用本网站的更多信息。

0
Spec
考虑以下规范


(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"则不可能。

一种解决方案是在上述“问题”数据中包括完全限定的规范和失败的谓词。

1 个答案

0
参考:https://clojure.atlassian.net/browse/CLJ-2277(由 bbrinck 报告)
...