Clojure中的=和==的区别

32

在 REPL 上,如果我定义:

(def fits (map vector (take 10 (iterate inc 0))))

然后调用

(== [2] (nth fits 2))

我得到了 false。

但是

(= [2] (nth fits 2))

返回 true。

这是期望的吗?我尝试了(class [2])和(class (nth fits 2)),两者都返回持久向量(Persistent Vector)。

2个回答

55

== 用于比较数字。如果其中任意一个参数不是数字,则始终返回 false:

(== :a :a)
; => false

你可以在REPL中使用 (clojure.contrib.repl-utils/source ==) 命令(当然需要先加载 repl-utils),可以看到 == 调用了 clojure.lang.Numbersequiv 方法。以下是来自 GitHub 最新或接近最新提交的 clojure/lang/Numbers.java 的相关部分:

static public boolean equiv(Object x, Object y){
    return y instanceof Number && x instanceof Number
           && equiv((Number) x, (Number) y);
}

对于可能不是数字的事物进行相等性比较时,请使用=。当您确实处理数字时,==应该会更快一些。


7

“==”是一种类型无关的比较数字的方式。

(== 3 3.0)
;=> true

(= 3 3.0)
;=> false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接