2010-03-02 46 views
32

在REPL,如果我定義=和== Clojure中

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

,然後調用

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

我得到錯誤的。

(= [2] (nth fits 2)) 

返回true。

這是預期嗎?我試過(類[2])和(類(第n擬合2)都返回持久矢量

回答

55

==是比較數字如果任其參數是不是一個數字,它總是返回false:。

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

你可以通過在REPL說(clojure.contrib.repl-utils/source ==)看到(帶repl-utilsrequire「d當然,),==調用的clojure.lang.Numbersequiv方法的clojure/lang/Numbers.java的相關位(從最新的或近於最新提交在GitHub上):

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

使用=進行等式比較的可能不是數字的東西。當你實際上處理號碼時,==應該稍微快一些。

+0

感謝米哈爾的類型無關的方式! – 2010-03-03 16:12:45

+1

不客氣。 :-) – 2010-03-03 19:44:52

7

==是比較數字

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false