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

欢迎!请参阅关于页面获取更多关于该功能的详细信息。

0
data.int-map

`
(iset/union (iset/int-set)

        (iset/dense-int-set))

`

抛出java.lang.IllegalArgumentException: 无法合并不同密集度的整集合。

这也许不完全是错误,但GitHub上的README声称

bq. dense-int-set的行为与int-set相同,区别仅在于它们的内存效率。

我认为应该可以混合密集/普通集合,或者明确在文档中说明这一点,也可以更新错误消息,因为它对我显然不是原因(我已经完全忘记了我在这个地方使用了密集集合,并认为问题是由transients引起的)。

3 个答案

0

评论者:ztellman

这有点复杂,因此我可能只是澄清一下,一开始在文档中说明这是不可能的,但预期行为是操作以不同密度的集合组合应返回较低密度的组合集。

0

评论者:jbiserkov

有道理。

查看(链接:https://github.com/clojure/data.int-map/blob/5442570fafa3eb4bbeec3286d67c9295d484fc4f/src/main/java/clojure/data/int_map/IntSet.java#L371)文本:代码,我不确定这个检查/异常是否是“公开API”的一部分,还是作为向你发出早期错误信号的“内部不变量违反而设计的”。

再次感谢您快速回复。在README中添加一个注释就足够了。交集和差集不会抛出异常,因为它们不使用合并操作。根据我对(链接:https://github.com/clojure/data.int-map/blob/9b34590f56db3e92a39eeb8ea31a8e8afbfa09b3/src/main/java/clojure/data/int_map/IntSet.java#L366 文本的阅读:代码),尽管结果集合的密度(leafSize)与这个参数一致。

这可以使用吗?这值得麻烦吗?

`
返回 new IntSet(Math.min(leafSize, s.leafSize),

              Math.min(log2LeafSize, s.log2LeafSize), 
              node);

`

异常可以更明确地说明“不能计算int集和稠密int集的并集”。

使用“构造函数”名称和失败的操作名称(使用并集而不是合并)可以使问题对最终用户更清晰。

离题:这现在已经不再影响我的程序了 - 只有第一个实现使用了并集/差集/交集。第二个和第三个只使用disj。第一个实现已经完成了其用途 - 确保第二个是正确的。现在第二个可以用来验证第三个的正确性,在更加多样化的输入集上,其中某些输入使用稠密集是有意义的。

0
参考: https://clojure.atlassian.net/browse/DIMAP-13 (jbiserkov报告)
...