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

欢迎!请查看 关于 页面以获取更多关于此工作方式的信息。

0 投票
Spec

似乎如果 ::my-spec 验证成功,那么 (s/and ::my-spec ::my-spec) 也应该验证成功。

这是我实际代码的简化版本,但我在这段使用组合 s/and、s/keys 和 s/or 规范的数据验证方面遇到了问题。这是我能够实现的最低篇幅的复制。

(s/def :a/coordinate
  (s/or :double double?
        :int int?))
(s/valid?
 (s/keys)
 {:a/coordinate 1.0})
;; true

(s/valid?
 (s/and (s/keys))
 {:a/coordinate 1.0})
;; true

(s/valid?
 (s/and (s/keys)
        (s/keys))
 {:a/coordinate 1.0})
;; false

(s/explain-str
 (s/and (s/keys)
        (s/keys))
 {:a/coordinate 1.0})
;; "[:double 1.0] - failed: double? in: [:a/coordinate] at: [:a/coordinate :double] spec: :a/coordinate\n[:double 1.0] - failed: int? in: [:a/coordinate] at: [:a/coordinate :int] spec: :a/coordinate\n"

1 答案

+1 投票

被选中
 
最佳答案

s/and 将已确认的结果流穿过 s/and 规范,所以如果已确认的结果不同(通常由于 s/or、s/cat、s/alt)则这不一定工作。

如果您想避免将 s/or 确认为不同的值,可以将该规范包裹在 s/nonconforming 中。

...