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

问题描述 投票:0回答:1

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

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

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

第一个断言失败,但第二个断言通过。这是定义的行为吗?我需要提交错误报告吗?

我期望相等运算符传递这两个断言。

clojure equality
1个回答
6
投票

如果您查看 Clojure 的平等指南,摘要部分的第一句话回答了这个问题:

Clojure 的

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

因为 Java 数组(

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

在第二个断言中,当

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

该平等指南有很多有价值的信息,因此值得研究。而且最好记住,在 Clojure 中,如果您想推理代码,最好坚持使用不可变值,而不是 Java 数组之类的东西。这就是巨大胜利的来源。

© www.soinside.com 2019 - 2024. All rights reserved.