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

欢迎!请参见关于页面以了解更多此如何运作的信息。

0
Clojure
user> (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不遵循java.util.Map$Entry的hashCode或equals合同。这导致了以上非自反的.equals行为。

我明白这不仅仅是一个简单的错误;这是一个根本性问题,因为在clojure.lang.MapEntry声称同时实现java.util.List和java.util.Map$Entry是不可能达到的。总的来说,我发现Clojure映射条目的等价于向量是非常有用的,可能不希望放弃这个特性。但是,我认为至少应该在这部分文档化,因为这个小问题可能会导致一些非常奇怪且难以捕捉的bug。

4 答案

0

评论者:jawolfe

这可能通过将seq更改为承诺一个对的处理而不是MapEntry来解决。我对于Clojure内部了解不足,不知道这是否会导致过大的性能损失,但也许值得考虑。

0

评论人:stu

Rich:您需要为此编写文档补丁吗?

0

评论人:richhickey

文档补丁已通过

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