我需要规范类似于映射条目的向量,其键本身就是经过规范的。每个向量看起来像这样
[: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
有人有任何更好的方法来规范我的类似映射条目的向量吗?值此机会,这些向量实际上并不来自映射,也不会映射到映射,因此我不能使用专门为映射设计的任何规范函数。