上下文
当数据无法符合规范时,问题中的":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]}
"val"的这一解释似乎不适用于函数无法符合fspec规范的情况。
重现
(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"中不再成立。