我正在尝试检查两个字节数组之间的相等性: 我正在运行以下代码:
;; 1
(assert (= (byte-array [0 0 0 0]) (byte-array [0 0 0 0])))
;; 2
(assert (= (seq (byte-array [0 0 0 0])) (seq (byte-array [0 0 0 0]))))
第一个断言失败,但第二个断言通过。这是定义的行为吗?我需要提交错误报告吗?
我期望相等运算符传递这两个断言。
如果您查看 Clojure 的平等指南,摘要部分的第一句话回答了这个问题:
Clojure 的
在比较表示相同值的不可变值或比较相同对象的可变对象时为 true。=
因为 Java 数组(
byte-array
返回的内容)是可变对象,并且您在第一个断言中传递两个不同的数组,所以失败是预料之中的。
在第二个断言中,当
=
遍历完 seq
返回的惰性序列时,它们是不可变序列,每个序列中的值都相同,因此断言按预期通过。
该平等指南有很多有价值的信息,因此值得研究。而且最好记住,在 Clojure 中,如果您想推理代码,最好坚持使用不可变值,而不是 Java 数组之类的东西。这就是巨大胜利的来源。