我需要为自身被规范化的映射条目样式的向量进行规范。每个向量看起来像这样
[:my.spec-ed.key/foo 42]
所使用的具体键可能不同,我希望写一个谓语,可以根据键动态地为任何映射条目样式的向量进行规范,就像通过(s/keys)对映射条目逐条进行规范一样。
在这种情况下,假设键的规范如下
(s/def :my.spec-ed.key/foo int?)
我最好的方法是规范映射条目样式的向量如下
(s/def :my.spec-ed.key/pair (s/and vector? #(s/valid? (first %) (second %))))
这可行,但我不喜欢它,因为当出错时(s/explain)并不像其他时候那么好。例如,(s/explain :my.spec-ed.key/foo "foo")
是很富有信息量的
"foo" - failed: int? spec: :my.spec-ed.key/foo
相比之下,(s/explain :my.spec-ed.key/pair [:my.spec-ed.key/foo "bar"])
最终并没有解释出真正的问题(我传了一个字符串而不是整型),我不得不去查找原始规范以找出这个
[:my.spec-ed.key/foo "bar"] - failed: (valid? (first %) (second %)) spec: :my.spec-ed.key/pair
有人有任何更好的规范我的映射条目向量方式的想法吗?这些向量实际上并不来自映射,也不会映射到映射,所以不能使用为特定映射设计的任何规范函数。