请在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()(从而 =)为一个值,而不是一个身份,比较。
Clojure 比较数字和集合的方式是类型无关的,但它确实使用了人们称之为“相等类”的东西。
现在对于数字,我对它们在独立相等类中的逻辑理解是不一样的,因此 1.0 和 1 就在独立的相等类中,所以它们不是相等的。

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 ; 这个比较有什么问题?

文档中提到
如果所有数字的值都相同(类型无关),则返回非nil值

0

评论者:alexmiller

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

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