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 版本中退化来的; same sort of spec (modulo the default-value arg to 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)(由cemerick报告)
...