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

Ioa*_*kis 2 equality 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
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*ott 9

如果您查看 Clojure\xe2\x80\x99s Equality Guide,摘要部分中的第一句话回答了这个问题:

\n
\n

=当比较表示相同值的不可变值或比较作为相同对象的可变对象时,Clojure\xe2\x80\x99s为 true。

\n
\n

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

\n

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

\n

关于平等指南有很多有价值的信息,因此值得研究。并且\xe2\x80\x99s 也很好地记住,在 Clojure 中,如果你想推理你的代码,你最好坚持使用不可变的值,而不是像 Java 数组这样的东西。那\xe2\x80\x99就是巨大胜利的所在。

\n