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 (由 alexmiller 建议)
...