2010-03-02 8 views
32

En REPL, si defino= y == en Clojure

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

y luego llamar

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

consigo falsa.

Pero

(= [2] (nth fits 2)) 

vuelve verdadera.

¿Se espera esto? Probé (clase [2]) y (clase (ataques nth 2) y ambos vuelven vector persistente

Respuesta

55

== es para comparar números Si alguno de sus argumentos no es un número, siempre devolverá falso:..

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

Como se puede ver diciendo (clojure.contrib.repl-utils/source ==) en el REPL (con repl-utilsrequire 'd, por supuesto), == llama al método de clojure.lang.Numbersequiv. el bit correspondiente de clojure/lang/Numbers.java (a partir de la última o próxima al último comprometerse en GitHub):

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

Use = para comparar la igualdad de cosas que pueden no ser números. Cuando en realidad se trata de números, == debería ser algo más rápido.

+0

Gracias Michal! –

+1

De nada. :-) –

7

== es una manera independiente tipo de comparación de números

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false