我正在尝试检查两个字节数组之间的相等性:我正在运行以下代码:
;; 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 通过。这是定义的行为吗?我需要提交错误报告吗?
我期望相等运算符传递这两个断言。
如果您查看 Clojure\xe2\x80\x99s Equality Guide,摘要部分中的第一句话回答了这个问题:
\n\n\n\n
=
当比较表示相同值的不可变值或比较作为相同对象的可变对象时,Clojure\xe2\x80\x99s为 true。
因为 Java 数组(返回的内容byte-array
)是可变对象,并且您在第一个断言中传递了两个不同的数组,所以失败是预料之中的。
在第二个断言中,当=
遍历 所返回的惰性序列seq
时,它们都是不可变序列,每个序列中的值都相同,因此断言按预期通过。
关于平等指南有很多有价值的信息,因此值得研究。并且\xe2\x80\x99s 也很好地记住,在 Clojure 中,如果你想推理你的代码,你最好坚持使用不可变的值,而不是像 Java 数组这样的东西。那\xe2\x80\x99就是巨大胜利的所在。
\n 归档时间: |
|
查看次数: |
120 次 |
最近记录: |