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) false user=> (.equiv rs vs) true user=> (.equiv vs rs) true user=> (.hashCode rs) 29824 user=> (.hashCode vs) true false user=> (System/identityHashCode vs) 显示出我们只是得到 Object hashCode false true user=> (.hasheq rs) 29824 user=> (.hasheq vs) true true user=> (.hasheq vs) true 预期:.hasheq(rs) 但没有实现 IllegalArgumentException 没有找到匹配的字段:hasheq,对于类 clojure.core.VecSeq clojure.lang.Reflector.getInstanceField (Reflector.java:271)

方法:在原始向量序列实现中实现 Object.hashCode()、Object.equals() 和 IHashEq.hasheq()。所有这些方法都利用 prim vec seq 本身,而不是底层的 prim vec,因为这要简单得多。hasheq() 实现调用了 Murmur3/hashOrdered,它接受一个 Iterable,所以我们还实现了 Iterable,使用一个遍历 seq 的迭代器。

一些现有测试已扩展以涵盖原始向量序列。

修复:clj-1364.patch

关闭时备注: 发布

5 个答案

0
by
 
最佳答案

1.10.2-alpha3版本中已修复。

0
by

评论者:jafingerhut

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

0
by

评论者:alexmiller

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

0
by

评论者:jafingerhut

非常好。抱歉,我没有仔细阅读补丁中的新测试来看到这也被包含在内。很好。

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