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

欢迎!请参阅关于页面以获取更多关于如何使用本站的信息。

+1 投票
Collections
已关闭

VecSeq(由(seq(vector-of :int 1 2 3))生成)未实现equals,hashCode,或hasheq,并且在此方面不与其他Clojure集合或序列进行适当的交互。

user=> (def rs (range 3)) user=> (def vs (seq (vector-of :int 0 1 2))) user=> rs (0 1 2) user=> vs (0 1 2) user=> (.equals rs vs) true user=> (.equals vs rs) ;; expect: true false user=> (.equiv rs vs) true user=> (.equiv vs rs) true user=> (.hashCode rs) 29824 user=> (.hashCode vs) ;; expect to match (.hashCode rs) 2081327893 user=> (System/identityHashCode vs) ;; 显示我们只是得到Object hashCode 2081327893 user=> (.hasheq rs) 29824 user=> (.hasheq vs) ;; expect same as (.hasheq rs) but not implemented at all IllegalArgumentException No matching field found: hasheq for class clojure.core.VecSeq clojure.lang.Reflector.getInstanceField (Reflector.java:271)

方法:在原始向量序列实现中实现Object.hashCode()、Object.equals()和IHashEq.hasheq()。所有这些都利用了原始向量序列本身,而不是底层的原始向量,因为这样可以简单得多。hasheq()实现调用Murmur3/hashOrdered,它需要一个可迭代的对象,因此还使用迭代器实现了可迭代对象。

一些现有的测试已扩展,包括对原始向量序列的覆盖率。

补丁:clj-1364.patch

随注记关闭: 发布

5 答案

0 投票
 
最佳答案

在1.10.2-alpha3中修复了缺陷。

0 投票

评论由: jafingerhut 提出

可能这是一个单独的问题,但是 (.equals (vector-of :long 0 1 2) (range 3)) 也为false(即没有在 vector-of 的返回值上调用 seq)。

0 投票

评论由: alexmiller 提出

同样的问题,已被补丁修复。

0 投票

评论由: jafingerhut 提出

太好了。抱歉,我没有仔细阅读补丁中的新测试,以至于没有看到这个问题已经包含在内。很高兴知道这个信息。

0 投票
参考: https://clojure.atlassian.net/browse/CLJ-1364(由 alexmiller 报告)
...