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

欢迎!请访问关于页面以了解工作原理的更多信息。

0
文档

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

clojure.core/=
((链接:x) (链接:x y) (链接:x y & more))
相等性。如果 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 ; 这段比较有什么错误?

文档中说
如果所有num有相等的值(类型无关),则返回非nil

0

评论人:alexmiller

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

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