我需要规范键也是规范过的映射类似向量。每个向量看起来像这样
[: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
有人有什么更好的方法来规范我的映射类似向量吗?就这一点而言,这些向量实际上并不是来自映射,也不会映射到任何地方,所以我不能使用为专门适用于映射的规范函数。