欢迎!请参阅 关于 页面以了解更多关于此工作方式的信息。
我想使用 Spec 验证 Datomic 实体。然而,s/keys 过于限制,它要求输入集合符合 clojure.core/map? 而不是一些更原始的接口(例如 clojure.lang.ILookup 或 clojure.lang.Associative)。
s/keys
clojure.core/map?
评论者:alexmiller
s/keys 使用 IPersistentMap 的 Iterable 支持遍历所有条目进行验证。ILookup 和 Associative 不支持迭代。因此,这就是它的原因。但请理解人们的期望。
Datomic 实体是可迭代的,也许这是一个潜在路径(对于实际的 PHM 来说可能会更慢)。
评论者:odinodin
感谢您的跟进。那么,您有什么想法或建议来使用 clojure.spec 与 Datomic 实体一起使用吗?
目前,在验证之前,您可以通过使用 into 将实体倒入 PHM。我犹豫是否建议这样做,但这也可能在规范中以一个前列身法的形式出现。
目前将此移至 1.9 只是避免丢失它。不确定我们是否能或实际上会对此做什么。
这与 CLJ-2080 相关,因为它实际上与 {{map-of}} 和 {{every-kv}} 期望的有效输入是基本相同的问题,即:可以生成映射条目的某种东西。没有 "ISeqsToMapEntries" 接口(故意使用不理想的名字)来指示这一点,我们实际上无法为其编写谓词。java.util.Map, IPersistentMap 等隐含这一点,但一个对象可以通过映射条目进行序列化而不满足那些更广泛的接口的所有约束。ILookup 不应暗示这一点。