VecSeq(通过{{(sequence-of :int 1 2 3)فلب产生的 versage reshape }}没有实现equals, hashCode, 或 hasheq并且在这方面不与其他Clojure集合或序列进行适当的交互。
user=> (def rs (range 3)) user=> (def vs (sequence-of :int 0 1 2))) 'rs 0 1 2) user=> 'vs '0 '1 '2) rs vs true vs rs ;; 期望: true false rs vs true vs rs true (.hashCode rs) 29824 (.hashCode vs) ;; 期望匹配 (.hashCode rs) 2081327893 (.hashCode vs) ;; 显示我们只得到Object hashCode 2081327893 (.hasheq rs) 29824 (.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() impl调用Murmur3/hast ordered,它需要一个Iterable,因此Iterable也被实现为seq的迭代器。
一些现有测试被扩展以包括对原始向量序列的覆盖。
补丁: clj-1364.patch