2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面了解此工作方式的更多信息。

0
data.int-map

这与https://dev.clojure.org/jira/browse/CLJ-700相关

contains?无法在临时集合上工作

当然,我们期望data.int-map的工作方式与一般集合相同,因此我对此没有抱怨。然而,在此帖中显示的解决方案是直接将集合用作函数: https://groups.google.com/forum/#!topic/clojure/lQVmZ-jcdiU

这可行
((transient #{1 2 3}) 2)
;=> 2

而不可行 :(
((transient (int-set #{1 2 3})) 2)
;=> CompilerException java.lang.IllegalArgumentException: contains?不支持类型: clojure.data.int_map.TransientIntSet

我检查了代码,TransientIntSet支持TransientIntSet接口的contain方法,可以直接使用并返回正确的值,但这显然不是使用互操作性的正则方式,也不必为了这个特定情况去寻找它。

6个回答

0

评论由:ztellman 提出

如果我说错了,这个问题的唯一解决方案是更改Clojure的实现,对吗?我认为在这个库中无法对其进行更改。

0

评论由:carocad 提出

当然,"contains?"的行为无法在这个库内部修复。但是,这个工单是关于将临时集合用作函数的。(请参阅说明示例)

Clojure 的 transient 集允许在将集合用作函数时查找键。然而,data.int-map 在作为函数调用时内部使用 "contains?"。因此打破了预期的集合行为。

Clojure 通过将集合用作函数时调用 "get" 函数来处理此用例:[点击查看](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentSet.java#L50)。因此,永远不会分派对 "contains?" 的调用。

当前 int-map 集合的行为迫使用户区分正在使用哪种集合类型,以便调用正确的函数。

0

评论由:ztellman 提出

好的,这说得通。我会相应地更新库。

0

评论由:carocad 提出

Clojure 1.9 通过添加一个新的接口并包含必要的方法来解决 transient 的问题。因此,这里描述的解决方案现在不再有效,我认为 int-map 应该同样实现该接口。

0

评论者:[email protected]

看起来通过提交 36846ff 和 2d5d0e5 已修复此问题。

0
参考:[点击查看](https://clojure.atlassian.net/browse/DIMAP-14)(由 alex+import 报告)
...