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

欢迎!请查看关于页面了解更多关于这个站点如何运作的信息。

0
Spec
every-kv 文档中提到“接受单独的键和值前缀,并在关联集合上工作”。向量对于 associative? 返回 true,但目前不工作


user=> (s/conform (s/every-kv any? any?) [])
[]
user=> (s/conform (s/every-kv any? any?) [1 2 3])
:clojure.spec/invalid
user=> (s/conform (s/every-kv integer? string?) [])
[]
user=> (s/conform (s/every-kv integer? string?) ["x"])
:clojure.spec/invalid


另一个类似的问题


(s/explain-data (s/every-kv int? int?) [{:a :b}])
UnsupportedOperationException nth 不支持此类型:PersistentArrayMap  clojure.lang.RT.nthFrom (RT.java:903)


*原因:* 向量不应该与 every-kv 一起使用。every-kv 和 every-impl 的组合假设传递给 every-kv 的集合可以提供一个映射项的序列。在解释的情况下,由 every-kv 创建的 ::kfn 使用键而不是元素索引来创建更好的路径段。kfn 假设集合的元素可以调用 `(nth entry 0)`。在上面的解释失败中,映射 {:a :b} 将在调用 nth 时抛出。

*建议:* 执行以下操作以更清楚地说明 coll 元素是映射项的要求

*修改文档字符串,将“是一个映射”更改为“序列到映射项”
*修改 kfn,以添加检查这个元素是否是条目。如果是条目,则使用它的键。如果不是,则使用该元素的索引。在这种情况下,当传入条目时,它将报告实际的键,但当传入不是条目的事物时,它将报告非条目的集合基于索引。

修补后,explain-data 调用将提供有用的错误而不是上面的异常


user=> (s/explain-data (s/every-kv int? int?) [{:a :b}])
#:clojure.spec.alpha{:problems ({:path [], :pred vector?, :val {:a :b}, :via [], :in [0]})}



*补丁:* clj-2080-8.patch

8 答案

0

评论者:alexmiller

目前,我倾向于认为every-kv中的文档应更严格,建议使用“map”而不是“关联集合”,但会与Rich确认。

0

评论者:alexmiller

更新以应用到master

0

评论者:alexmiller

更新补丁以应用到spec.alpha.

0
_评论者:stu_

请更新此工单,包括描述中所示示例的预期行为,以及展示该预期行为的测试。我仍在看到向量对于conform失败。 


(s/explain-data (s/every-kv integer? string?) ["x"])
=> #:clojure.spec.alpha{:problems ({:path [], :pred vector?, :val "x", :via [], :in [0]})}
0

评论者:alexmiller

向量应该失败 - every-kv需要一个map条目的序列。补丁在文档字符串中澄清了这一点,并修复了在生成explain-data时可能抛出的异常。我已经更新了标题,包括行为后的explain-data描述,并为补丁添加了一个测试。

0

评论者:alexmiller

在一段时间前丢失了文档字符串更改,已重新添加到-7补丁中。

0

评论者:alexmiller

-8 次更新应用到master,没有语义变更

0
by
参考: https://clojure.atlassian.net/browse/CLJ-2080(由bbloom报告)
...