上下文
当数据无法符合规格时,问题的":val"指向不符合规格的数据。这个性质很好,因为每个问题的":val"都将存在于整个"explain-data"结构的":value"中。例如
(require '[clojure.spec.alpha :as s])
(s/explain-data
(s/coll-of int?)
[1 2 :a])
;; #:clojure.spec.alpha{:problems ({:path [], :pred int?, :val :a, :via [], :in [2]}), :spec #object[clojure.spec.alpha$every_impl$reify__934 0x1b235c3e "clojure.spec.alpha$every_impl$reify__934@1b235c3e"], :value [1 2 :a]}
当函数无法符合fspec规格时,这种对":val"的解释似乎不适用。
重现
(require '[clojure.spec.alpha :as s])
(s/explain-data
(s/coll-of (s/fspec
:args (s/cat :x int?)))
[(fn [%] (/ 1 %))])
;; #:clojure.spec.alpha{:problems ({:path [], :pred (apply fn), :val (0), :reason "Divide by zero", :via [], :in [0]}), :spec #object[clojure.spec.alpha$every_impl$reify__934 0x420c3355 "clojure.spec.alpha$every_impl$reify__934@420c3355"], :value [#function[expound.alpha/eval28876/fn--28880]]}
预期:为了与":val"的正常工作方式保持一致,"val"应该是匿名函数。虽然函数参数非常有用,但也许可以将它们与不同的键关联起来?
实际:"val"包含函数参数,因此"val"不再存在于"value"中。