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.lang.MapEntry没有遵循java.util.Map$Entry的hashCode或equals合约。这导致上述非自反的.equals行为。

我意识到这不仅仅是简单的一个错误;它是一个基本问题,因为在clojure.lang.MapEntry声称做到的java.util.List和java.util.Map$Entry之间不可能一致实现。总的来说,我觉得Clojure映射条目与向量等价非常有用,可能不会想放弃这个功能。但是,我认为至少应该在某个地方记录这个瑕疵,因为它可能导致一些非常奇怪且难以捕获的错误。

4 答案

0

评论由:jawolfe提供

通过更改seq以承诺一个或对而不是MapEntry的序列,可能会修复这个问题。我不太了解Clojure的最新内部实现,不知道这会带来太大的性能影响,但也许值得考虑。

0

评论由:stu提供

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

0
by

评论者:richhickey

文档补丁无问题

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