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