我在探索spec,但我对设计的一部分不理解。似乎没有一个很好的机制来表示“此值同时满足一系列spec”。
从
(s/def :example/s1 vector?)
(s/def :example/s2 vector?)
(s/def :example/spec (s/and :example/s1 :example/s2))
(s/valid? :example/spec [1 2 3]) ; => true
然后修改:example/s1
为
(s/def :example/s1 (s/cat :a integer? :b integer? :c integer?))
现在
(s/valid? :example/spec [1 2 3]) ; => false
这使我陷入调试spec的困境;我不想再次陷入这种处境。如果spec更复杂,我不知道怎么起步,所以我想尽量避免在中间完全转换/符合数据的函数,除非这是明确要求的。
s/every
对于通用使用基本上是不安全的——尽管名称如此,它并没有检查spec对于每个条目都是真实的。我有一些函数可以扩展长向量并添加新条目,基于s/every
的spec将不会检查最可能包含错误值的那些值。
我处于需要重新实现s/every
(以全面性)或s/and
(以验证但非符合)的位置——但对我来说有点困惑,因为我刚刚假设我所想要的将是通用情况。我遗漏了什么?为什么没有包括s/and
的非符合变体在spec中?