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)

方法:在原始向量seq实现中实现Object.hashCode(),Object.equals()和IHashEq.hasheq()。所有这些方法都利用prim vec seq本身,而不是作为底层prim vec,因为它相当简单。hasheq()的实现调用了Murmur3/hashOrdered,它接受一个可迭代的对象,因此可迭代对象也是通过seq的迭代器实现的。

某些现有测试已扩展以包括对原始向量seq的覆盖。

补丁:clj-1364.patch

已关闭,附注:发布

5 答案

0
 
最佳答案

在1.10.2-alpha3版本中修复。

0

评论者:jafingerhut

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

0

评论者:alexmiller

相同的问题,并由补丁修复。

0

评论者:jafingerhut

太好了。抱歉,我没有仔细阅读补丁中的新测试,没有看到这一点。知道了很好。

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