请在2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面了解更多关于如何使用本站的信息。

0
文档

对 clojure.core/= 的文档表述为它以类型无关的方式比较数字。实际上比较方式是类型相关的。如果上述说法正确,那么 (= 1 1.0) 应该返回 true,而不是 false;

clojure.core/=
((链接: x) (链接: x y) (链接: x y & أكثر))
相等性。如果 x 等于 y 则返回 true,否则返回 false。与
Java x.equals(y) 相同,但它也适用于 nil,并以类型无关的方式比较
数字和集合。Clojure 的不可变数据
结构定义 equals()(从而 =)为一个值,而不是一个身份
比较。

5 答案

0
_评论者:hiredman_

我认为这比描述的要复杂。

=在 JVM 类型无关的方式比较事物,但它确实使用了人们所说的“相等类”

(= [1 2] '(1 2))

(= {:a 1} (doto (java.util.HashMap.) (.put :a 1)))

等等。

对于数字来说,对我来说,似乎逻辑上应该在不同的相等类中区分浮点数和精确数字

在这种情况下,1.0 和 1 分别属于不同的相等类,所以它们不相等。
0

评论者:gfredericks

这个文档对不熟悉这件事的人来说确实是误导性的。数字可能是首先想到的“类型无关方式”的东西。简要提及 {{==}} 函数可能是有用的。

0

评论由:bordatoue 发表

我发现 == 函数让人困惑
例如
(== 1 1.0) => true
(== 1 1.0M) => false ; 这段比较有什么问题?

文档中说
如果所有数值都具有等效值(类型无关),则返回非空值

0

评论由:alexmiller 发表

@George - 那最后那个例子(== 1 1.0M)实际上是一个在1.6中修复的bug,它将返回true。

0
参考资料: https://clojure.atlassian.net/browse/CLJ-1333(由 alex+import 报告)
...