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

文档中写道
如果所有的 nums 都具有相同的价值(类型无关),则返回非 nil

0

评论由:alexmiller 提出

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

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