2024 Clojure 状态调查问卷中分享您的想法!

欢迎!有关如何使用本网站的更多信息,请参阅关于页面。

0
data.int-map

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

contains?在短暂集合上不起作用

当然,对data.int-map如何工作的期望与对一般集合的相同,因此我对此没有异议。然而,在这个帖子中显示的 workaround 是直接将集合用作函数:https://groups.google.com/forum/#!topic/clojure/lQVmZ-jcdiU

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

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

我检查了代码,发现TransientIntSet支持接口的contain方法,可以直接使用并返回正确的值,但这绝对不是互操作的好方法,也不必为了这种特定情况四处寻找。

6 个答案

0

评论由:ztellman 发布

如果我的理解有误,那么解决这个问题唯一的办法是修改 Clojure 的实现,对吗?在这个库中没有可以做的任何事情来改变这种行为。

0

评论由:carocad 发布

当然,在库内部无法修复"contains?"行为。但是这个工单是关于将短暂集合用作函数的。(见描述示例)

当将集合用于函数时,Clojure 的暂时性集合允许查找键。然而,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 通过添加一个新的接口以及必要的方法解决了暂时性的问题。因此,这里描述的解决方案不再有效,我认为 int-map 也会实现该接口的期望

0

评论者:[email protected]

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

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