Clojure 中 Java 字节数组的意外相等语义

Unexpected equality semantics of Java byte arrays in Clojure

提问人:Ioannis Mourginakis 提问时间:10/27/2023 最后编辑:Ioannis Mourginakis 更新时间:10/28/2023 访问量:93

问:

我正在尝试检查两个字节数组之间的相等性: 我正在运行以下代码:

;; Test 1
(= (byte-array [0 0 0 0])
   (byte-array [0 0 0 0])) ;; => false

;; Test 2
(= (seq (byte-array [0 0 0 0]))
   (seq (byte-array [0 0 0 0]))) ;; => true

测试 1 失败,但测试 2 通过。这是定义的行为吗?我需要提交错误报告吗?

我本来以为相等运算符会传递这两个断言。

Clojure 等式

评论


答:

9赞 James Elliott 10/27/2023 #1

如果您看一下 Clojure 的 Equality Guide,就会发现 Summary 部分的第一句话回答了这个问题:

在比较表示相同值的不可变值时,或者比较作为相同对象的可变对象时,Clojure 的值为 true。=

因为 Java 数组(返回的数组)是可变对象,并且您在第一个断言中传递了两个不同的数组,所以失败是意料之中的。byte-array

在第二个断言中,当遍历 返回的惰性序列时,它们都是不可变的序列,每个序列中的值相同,因此断言按预期传递。=seq

关于平等指南有很多有价值的信息,所以值得研究。同样值得一提的是,在 Clojure 中,如果你想对代码进行推理,最好坚持使用不可变的值,而不是像 Java 数组这样的东西。这就是大赢家的来源。