Clojure 2024状态调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于功能的信息。

+1 投票
集合
已关闭

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

带有注释已关闭: 发布

5 答案

0 投票
 
最佳答案

1.10.2-alpha3 版本中已发布修复。

0 投票

评论由:jafingerhut 提出

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

0 投票

评论由:alexmiller 提出

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

0 投票

评论由:jafingerhut 提出

非常好。抱歉,我没有仔细阅读补丁中的新测试,没有看到这个问题已被涵盖在那里。好的。

0 投票
参考: https://clojure.atlassian.net/browse/CLJ-1364(由 alexmiller 提出)
...