请在 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 相同,区别仅在于它们的内存效率。

我认为应该可以混合稠密/正常集合,或者明确在文档中说明,并可能更新错误消息,因为对我来说这不是明显的原因(我完全忘记了我在这个位置使用了稠密集,并认为问题是由于瞬态造成的)。

3 个答案

0

评论者:ztellman

这稍微有点复杂,所以我在文档中可能只是澄清,最开始无法实现,但是预期的行为是,带有不同密度的集合的操作应该返回较低密度的组合集合。

0

评论者:jbiserkov

有道理。

根据链接(代码),我不确定检查/异常是否是“公共 API”的一部分,还是打算给你一个“快速失败”的信号,表明内部不变性已被违反。

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

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

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

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

`

异常可以更明确地说明“无法计算整数集和密集整数集的并集”。

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

题外话:这现在对我的程序实际上没有任何影响 - 只有第一个实现使用并集/差集/交集。第二个和第三个只使用disj。第一个实现已经完成了它的作用 - 确保第二个是正确的。现在第二个可以用来验证第三个的正确性,在更多的输入集上,对于其中某些密集集是有意义的。

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