gpt4 book ai didi

clojure - 覆盖 Clojure 记录的 equals

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

我有一个记录,其中一个字段的类型为 byte[]。由于没有为数组定义 Clojure 相等性,我们有:

(defrecord Record [^bytes field])
(def rec1 (->Record (byte-array (map byte "abc"))))
(def rec2 (->Record (byte-array (map byte "abc"))))

(= rec1 rec2)
; => false

当然,这是 Not Acceptable 。

现在,我们确实有了 java.util.Arrays.equals,它为数组定义了适当的相等性。由于 = 对于其他 Clojure 对象非常有效,我不想每次比较我的 Record 类型、包括该类型的类型等时都使用互操作。

是否可以覆盖记录的 equals 函数来处理数组?


我尝试了以下方法:

(defrecord Record [^bytes field])
Object
(equals [this other] (Arrays/equals this other)))

但是我得到一个错误,“重复的方法名称和签名”。

最佳答案

在 clojure 中,数组不相等的原因是它们可以随时更改,相等的对象应该保持相等。想象一下像 {rec1 1} 这样的 map 。如果你的两个对象比较相等,我应该能够在其中查找 rec2 并找到答案 1。但是如果有人执行 (aset (:field rec2) 1 3),突然 rec2 变了,不再等于 rec1!。这不是应该发生的事情,所以 clojure 说它们不相等。

这类似于原子和其他可变容器的相等语义:仅仅因为两个可变容器(原子、或数组)现在具有相等的内容并不意味着容器本身相等。当有人修改其中一个时,这种脆弱的平等可能随时改变。同样,你的两个数组随时可能变得不相等;这意味着,实际上,它们根本就不平等。

关于clojure - 覆盖 Clojure 记录的 equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23121320/

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