欢迎!请访问 关于 页面了解更多关于这个平台的信息。
我想使用 specs 验证 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 实体是可序列的,可能是潜在的解决路径(但用于实际 PHMs 可能会慢一些)。
评论由:odinodin 提供
感谢您的跟进。那么,有没有关于如何使用 clojure.spec 与 Datomic 实体一起使用的一些建议或指导?
目前,您可以在验证之前使用into将实体倒入PHM。我犹豫要不要建议它,但这也可能是规范中的前置符合者。
暂时将其移至1.9版本,以免丢失。不过,不确定我们是否真的能或将要对此做些什么。
这与CLJ-2080相关,因为它涉及的是map-of和every-kv实际上期望的有效输入的同基本问题,即:能将映射项序列化的东西。如果没有用于表示此情况的接口“ISeqsToMapEntries”(故意取一个坏名字),我们实际上无法为其编写谓词。java.util.Map,IPersistentMap等隐含着这一点,但一个对象可以将其自身序列化为映射项,而不必满足那些更广泛接口的所有约束。ILookup不隐含这一点,也不应该隐含这一点。