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

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

+1
集合
已关闭

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) ;; 期望:true false user=> (.equiv rs vs) true user=> (.equiv vs rs) true user=> (.hashCode rs) 29824 user=> (.hashCode vs) ;; 期望匹配 (.hashCode rs) 2081327893 user=> (System/identityHashCode vs) ;; 显示我们只是获取到 Object hashCode 2081327893 user=> (.hasheq rs) 29824 user=> (.hasheq vs) ;; 期望与 (.hasheq rs) 相同但未实现 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,它接受一个 Iterable,因此 Iterable 也通过迭代器实现了序列。

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

补丁: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](https://clojure.atlassian.net/browse/CLJ-1364)(由alexmiller报告)
...