我在尝试使用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
(以验证但不规范)的位置——但这对我来说有些令人困惑,因为我曾经以为我所需要的是通用用例。我错过了什么吗?为什么在spec中没有包含一个不规范的s/and
变体呢?