当规范失败一个 'keys*' 规范时,'in' 路径指的是校验后的路径。这与其他规范(包括 'cat' 规范)不同,其他规范的 'in' 路径指示原始(未校验)数据中的路径。
rlwrap clj -Srepro -Sdeps '{:deps {org.clojure/spec.alpha {:mvn/version "0.2.176"}}}'
Clojure 1.9.0
user=> (require '[clojure.spec.alpha :as s])
nil
user=> (s/def ::point1 (s/cat :x int? :y int?))
user/point1
user=> (s/def ::x int?)
:user/x
user=> (s/def ::y int?)
:user/y
user=> (s/def ::point2 (s/keys* :req-un [::x ::y]))
:user/point2
user=>; 对于 `cat` 规范,`in` 将指代符合前位置的位点
user=> (s/explain ::point1 [0 nil])
nil - 失败:int? in: [1] at: [:y] spec: :user/point1
nil
user=>; 但对于 `keys*` 规范,`in` 将指代符合后位置的位点
user=> (s/explain ::point2 [:x 0 :y nil])
nil - 失败:int? in: [:y] at: [:y] spec: :user/y
nil
user=>
对于用户查看默认错误消息来说,这很令人困惑,因为他们的原始数据在例子中并没有':y'键。此外,这使第三方库难以在上下文中显示错误值。