提问人:Ioannis Mourginakis 提问时间:10/27/2023 最后编辑:Ioannis Mourginakis 更新时间:10/28/2023 访问量:93
Clojure 中 Java 字节数组的意外相等语义
Unexpected equality semantics of Java byte arrays in Clojure
问:
我正在尝试检查两个字节数组之间的相等性: 我正在运行以下代码:
;; 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 通过。这是定义的行为吗?我需要提交错误报告吗?
我本来以为相等运算符会传递这两个断言。
答:
9赞
James Elliott
10/27/2023
#1
如果您看一下 Clojure 的 Equality Guide,就会发现 Summary 部分的第一句话回答了这个问题:
在比较表示相同值的不可变值时,或者比较作为相同对象的可变对象时,Clojure 的值为 true。
=
因为 Java 数组(返回的数组)是可变对象,并且您在第一个断言中传递了两个不同的数组,所以失败是意料之中的。byte-array
在第二个断言中,当遍历 返回的惰性序列时,它们都是不可变的序列,每个序列中的值相同,因此断言按预期传递。=
seq
关于平等指南有很多有价值的信息,所以值得研究。同样值得一提的是,在 Clojure 中,如果你想对代码进行推理,最好坚持使用不可变的值,而不是像 Java 数组这样的东西。这就是大赢家的来源。
评论