在Clojure中=和==

时间:2010-03-02 16:05:35

标签: clojure

在REPL上,如果我定义

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

然后致电

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

我弄错了。

但是

(= [2] (nth fits 2))

返回true。

这是预期的吗?我试过(class [2])和(class(nth fit 2)并且都返回Persistent Vector。

2 个答案:

答案 0 :(得分:55)

==用于比较数字。如果它的任何一个参数不是数字,它将始终返回false:

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

正如您在REPL上(clojure.contrib.repl-utils/source ==)所说的那样(当然,repl-utils require'),==调用了equiv方法clojure.lang.Numbersclojure/lang/Numbers.java的相关位(来自GitHub上的最新或接近最新提交):

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

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

答案 1 :(得分:7)

==是一种与数字无关的类型

(== 3 3.0)
;=> true

(= 3 3.0)
;=> false