2010-03-02 6 views
32

Sur REPL, si je définis= et == dans Clojure

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

puis appelez

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

Je reçois faux.

Mais

(= [2] (nth fits 2)) 

renvoie true.

Est-ce prévu? J'ai essayé (classe [2]) et (classe (fits nième 2) et à la fois retour vecteur persistant

Répondre

55

== est pour comparer les numéros Si l'un de ses arguments est pas un nombre, il retournera toujours faux..

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

Comme vous pouvez le voir en disant (clojure.contrib.repl-utils/source ==) au REPL (avec repl-utilsrequire « d, bien sûr), == appelle la méthode equiv de clojure.lang.Numbers. le bit correspondant de clojure/lang/Numbers.java (de la dernière ou à proximité à dernier engagement sur GitHub):

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

Utilisez = pour les comparaisons d'égalité de choses qui peuvent ne pas être des nombres. Lorsque vous traitez des numéros, == devrait être un peu plus rapide.

+0

Merci Michal! –

+1

De rien. :-) –

7

== est un type de manière indépendante des chiffres comparant

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false