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) ;; expect: true false user=> (.equiv rs vs) true user=> (.equiv vs rs) true user=> (.hashCode rs) 29824 user=> (.hashCode vs) ;; expect to match (.hashCode rs) 2081327893 user=> (System/identityHashCode vs) ;; 显示我们只是得到Object hashCode 2081327893 user=> (.hasheq rs) 29824 user=> (.hasheq vs) ;; expect same as (.hasheq rs) but not implemented at all 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,它需要一个可迭代的对象,因此还使用迭代器实现了可迭代对象。
一些现有的测试已扩展,包括对原始向量序列的覆盖率。
补丁:clj-1364.patch