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 更改为承诺一对序列而不是 MapEntries 来修复。我对 Clojure 内部了解不多,不知道这是否会带来太大的性能损失,但也许值得考虑。

0

评论由:stu 制作

Rich:您想要对此进行文档补丁吗?

0

由:richhickey 评论

文档补丁就绪

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