当一个 spec 失败时,在 'keys*' spec 中,'in' 路径指的是 conformance 之后的路径。这与其它 spec(包括 'cat' spec)不同,在这些 spec 中,'in' 路径表示原始(pre-conformed)数据中的路径。
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` spec,`in` 将指在 conformance 之前的位置
user=> (s/explain ::point1 [0 nil])
nil - failed: int? in: [1] at: [:y] spec: :user/point1
nil
user=> ;; 但对于 `keys*` spec,`in` 将指在 conformance 之后的位置
user=> (s/explain ::point2 [:x 0 :y nil])
nil - failed: int? in: [:y] at: [:y] spec: :user/y
nil
user=>
这对于查看默认错误信息的用户来说很令人困惑,因为示例中原始数据中并没有 ':y' 键。此外,这使得第三方库难以在上下文中显示错误值。