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

欢迎!请参阅关于页面以了解更多关于此功能的信息。

0
Clojure
用户> (let [h (HashMap.)]
       (.put h 1 2)
       (let [p1 (first h)
             p2 (first {1 2})]
        (println (.hashCode p1) (.hashCode p2)
                 (= p1 p2) (= p2 p1)
                 (.equals p1 p2) (.equals p2 p1))))

3 994 false false true false

Clojure的clojure.lang.MapEntry没有遵循hashCode或equals的契约(对于java.util.Map$Entry)。 因此,它会像上面那样导致非自反的>equals行为。

我意识到这不仅仅是一个简单的错误;这是一个基本问题,因为在java.util.List和java.util.Map$Entry中,无法始终一致地实现这两个接口,而clojure.lang.MapEntry正是这样声明的。 总体而言,我认为Clojure映射条目的行为等同于向量是非常有用的,可能不会想放弃这一点。 但,我认为至少应该在某处记录这样的问题,因为它可能导致一些非常奇怪且难以捕捉的bug。

4 个答案

0

评论者:jawolfe

可以通过将seq更改为承诺对序列成对的序列而不是MapEntry来解决此问题。 我对Clojure内部了解不多,不知道这是否会带来太大的性能打击,但也许值得考虑。

0

评论者:stu

Rich:这个文档补丁你需要吗?

0

评论者:richhickey

文档补丁已完成

0
参考: https://clojure.atlassian.net/browse/CLJ-750(由 jawolfe 报告)
...