2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面了解此功能的工作原理。

+1
Spec

`
user> (require '[clojure.spec :as s])
nil
user> (defrecord Box [a])
user.Box
user>
user> (s/conform

    (s/cat :boxes (s/* #(instance? Box %))
           :name (s/coll-of integer?))
    [(Box. 0) [5]])

UnsupportedOperationException 无法创建空:user.Box user.Box (form-init8049111656025227309.clj:1)
user> (clojure.repl/pst *e)
UnsupportedOperationException 无法创建空:user.Box

   	user.Box (NO_SOURCE_FILE:2)
clojure.core/empty (core.clj:5151)
clojure.spec/every-impl/cfns--14008/fn--14014 (spec.clj:1215)
clojure.spec/every-impl/reify--14027 (spec.clj:1229)
clojure.spec/conform (spec.clj:150)
clojure.spec/dt (spec.clj:731)
clojure.spec/dt (spec.clj:727)
clojure.spec/deriv (spec.clj:1456)
clojure.spec/deriv (spec.clj:1463)
clojure.spec/deriv (spec.clj:1467)
clojure.spec/re-conform (spec.clj:1589)
clojure.spec/regex-spec-impl/reify--14267 (spec.clj:1633)

`

这是从-alpha7出现的回归;类似spec(考虑到coll-of的默认值参数)在这里按预期工作。

4个回答

+1

评论者:oakes

我自己也遇到了这个问题。将一个record与coll-of spec进行符合时应该显示一个正常的spec错误,而不是在spec实现深处抛出。

0
_评论者:alexmiller_

在这种情况下,它将s/*视为不匹配,并尝试将(Box. 0)与(s/coll-of integer?)进行匹配。这与初始谓词(coll?)相匹配,然后跌入:else情况,假定它可以调用empty。

您可以通过向coll-of添加:kind谓词来解决这个问题:


(s/conform
        (s/cat :boxes (s/* #(instance? Box %))
               :name (s/coll-of integer? :kind #(not (record? %))))
        [(Box. 0) [5]])
;;=> {:boxes [#user.Box{:a 0}], :name [5]}
0

由:interstar 发表评论

但它为什么一开始就要创建一个空的呢?

这是否意味着你无法在 spec 中检查记录的集合?

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