请在 2024 Clojure 状态调查! 中分享你的想法。

欢迎!请查看 关于 页面以获取更多关于其工作方式的信息。

0
Spec

我想使用规格来验证 Datomic 实体。但是 `s/keys` 限制得太死了,因为它要求输入集合必须符合 `clojure.core/map?` ,而不是某些更原始的接口(例如 clojure.lang.ILookup 或 clojure.lang.Associative)。

7 个答案

0

评论者:alexmiller

`s/keys` 使用 IPersistentMap 的可迭代支持来迭代所有条目进行验证。ILookup 和 Associative 不支持迭代。这就是为什么它必须是这样的。但是,请理解这种需求。

0

评论者:alexmiller

Datomic 实体是可迭代的,因此这可能是一个潜在的路径(但对于实际的 PHM 来说可能较慢)。

0

评论者:odinodin

谢谢跟进。你对如何使用 clojure.spec 与 Datomic 实体有任何想法或指导吗?

0

评论者:alexmiller

目前,您可以使用into将实体倒入PHM并在验证前进行操作。我犹豫是否提出这些建议,但它们甚至可以作为一个引领符出现在规范中。

0

评论者:alexmiller

将此内容移至1.9版本,以免丢失。不确定我们是否或能否实际对此做些什么。

0

评论者:alexmiller

这与CLJ-2080相关,因为它实际上与{{map-of}}和{{every-kv}}所期望的有效输入相同的根本问题,即:能够产生映射条目的东西。在没有接口"ISeqsToMapEntries"(故意取这个名字不好)来表示这一点的情况下,我们无法真正为它编写一个谓词。java.util.Map、IPersistentMap等隐含了这一点,但一个对象可以序列到映射条目而不满足那些更广泛接口的所有约束。ILookup不应该是这样的,也不应该是这样的。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2041](https://clojure.atlassian.net/browse/CLJ-2041)(由halgari报告)
...