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

欢迎!请参阅关于 页面以了解更多有关如何使用本服务的信息。

0
data.int-map

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

contains? 无法在临时集合上使用

当然,对 data.int-map 的使用期望与对普通集合的使用相同,因此我对此没有意见。但是,在这个帖子中显示的解决方案是:直接将集合用作函数。(请参阅描述示例)

;; 这行有效
((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报告)
...