上下文
当数据未能符合规格时,问题中的":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 "Division 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"中存在。