2024 Clojure状态调查中分享你的想法!

欢迎!请参阅关于页面,了解更多关于这个工作方式的信息。

0
Spec
上下文

当数据无法符合规范时,问题中的":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"中的情况。

4个答案

0

评论由:bbrinck 发表

这也使得错误信息具有误导性

`
(s/explain
(s/coll-of (s/fspec

         :args (s/cat :x int?)))

[(fn [%] (/ 1 %))])

;; In: [0] val: (0) fails predicate: (apply fn), Divide by zero
`

因为它似乎表明参数未能符合规范,而问题实际上函数本身不符合规范。

0

评论者:alexmiller

请勿设置修复版本 - 核心团队将在发布目标时进行此操作。这不会影响1.9版本。

0

评论由:bbrinck 发表

对此表示歉意 - 我将来会注意不要设置该字段。

多一点背景:有时候对一个问题中的“in”的解释很困难(https://dev.clojure.org/jira/browse/CLJ-2192)。在Expound中,我使用一种启发式方法来确定“in”路径应该如何工作,但这个启发式方法依赖于“val”存在于“value”中。由于这个问题,启发式方法不起作用,这意味着我无法可靠地报告规范错误。请参阅https://github.com/bhb/expound/issues/41

0
参考:https://clojure.atlassian.net/browse/CLJ-2258(由bbrinck报告)
...