gpt4 book ai didi

Clojure 值相等和集合

转载 作者:行者123 更新时间:2023-12-02 21:02:52 25 4
gpt4 key购买 nike

如果我有一个自定义类型,并使用它创建两个具有完全相同值的单独实例,我可以使用什么方法来确定这两个事物是等效的? 相同?=== 似乎不起作用。我本来期望有一些用于设置类型比较的协议(protocol)。最终,我希望这样就不可能将等效的东西添加到集合中。

(deftype Ref [id])
(def r1 (->Ref 1))
(def r2 (->Ref 1))
(= r1 r2) ;false rather than true
(def refs #{})
(conj refs r1 r2) ;adds both, but want one

= 可与 defrecord 配合使用,但如何为 deftype 定义 =

最佳答案

在您的 deftype 中,扩展 Object 并实现 equals 以赋予它们相等语义:

(deftype Ref [id]
Object
(equals [_ other] (= id (.id other))))

设置包含还需要哈希码支持:

(deftype Ref [id]
Object
(equals [_ other] (= id (.id other)))
(hashCode [_] id)
clojure.lang.IHashEq
(hasheq [_] id))

我实现了 Java 哈希支持和 Clojure hasheq支持那里。实现 IHashEq 会更快。

关于Clojure 值相等和集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26622511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com