我需要规范类似map-entry的向量,其键本身也是经过规范化的。每个向量看起来像这样
[:my.spec-ed.key/foo 42]
具体的键有所变化,我希望编写一个谓词,可以基于其键动态地规范类似map-entry的向量,就像通过(s/keys)逐条规范映射条目一样。
在这种情况下,假设键是这样的规范
(s/def :my.spec-ed.key/foo int?)
我能想到的唯一方式来规范类似map-entry的向量是这样
(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
有人有什么更好的方法来规范我的类似map-entry的向量吗?值得一提的是,这些向量实际上并不来自映射,也不打算映射到映射,所以不能使用专门为了在映射上工作的规范函数。