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

欢迎!请访问 关于 页面,以获取更多关于如何使用此页面的信息。

0
data.int-map

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

contains? 不适用于 transient 集合

当然,期望 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)
;=> 编译器异常 java.lang.IllegalArgumentException: contains? 不支持类型:clojure.data.int_map.TransientIntSet

我检查了代码,TransientIntSet 支持实现 TransientIntSet 接口的 contain 方法,可以直接使用并返回正确的值,但这绝对不是使用 interop 的好方法,也不需要为该特定情况查找它。

6 个回答

0

由 ztellman 发布的评论

如果我说错了,解决这个问题的唯一方法就是更改 Clojure 的实现,对吧?在我看来,这个库中没有可以改变这种行为的任何东西。

0

由 carocad 发布的评论

当然,“contains?” 行为无法在这个库内部修复。然而,此票据是关于将 transient 集合作为函数使用的问题。(请参阅描述示例)

Clojure的transient集合允许将集合用作函数时查找键。然而,data.int-map的transient-sets在作为函数调用时内部使用"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通过添加一个新的接口以及所需的方法解决了transients的问题。因此,这里描述的解决方案不再有效,并且我认为普遍的期望是int-map也实现该接口。

0

评论者:[email protected]

看起来这是通过提交36846ff和2d5d0e5修复的。

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