请在 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

有道理。

查看链接(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)。

这可以用作替代吗?这值得麻烦吗?

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

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

`

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

使用构造函数名称和操作失败的名字(使用并集而不是合并)可以使最终用户更清楚地知道问题所在。

离题:这对我现在的程序真的没有影响了——只有第一个实现使用了并集/差集/交集。第二个和第三个只是使用了disj。第一个实现已经完成了其目的——确保第二个是正确的。现在第二个可用于验证第三个的正确性,这在更广泛的输入集上完成,对于其中一些密集集是有意义的。

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