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

欢迎!有关此如何工作,请参阅关于页面获取更多信息。

+1投票
规范

`
用户> (require '[clojure.spec :as s])
nil
用户> (defrecord Box [a])
用户.Box
用户>
用户>

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

UnsupportedOperationException 无法创建空:user.Box user.Box (form-init8049111656025227309.clj:1)
用户> (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回归;相同的规范(关于 coll-of 的默认值参数外)在那里预期有效。

4 答案

+1投票

评论者:oakes

我也遇到了这个问题。将一个记录应用于 coll-of 规范应该显示一个正常的规范错误,而不是从 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](https://clojure.atlassian.net/browse/CLJ-1975)(由 cemerick 报告)
...