32 votes

= et == à Clojure

Sur REPL, si je définis

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

puis appelez

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

Je me trompe.

Mais

 (= [2] (nth fits 2))
 

retourne vrai.

Est-ce prévu? J'ai essayé (classe [2]) et (classe (nième correspond à 2) et les deux retournent vecteur persistant.

55voto

Michał Marczyk Points 54179

== est pour comparer des nombres. Si l'un de ses arguments n'est pas un nombre, il renverra toujours false:

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

Comme vous pouvez le voir en disant (clojure.contrib.repl-utils/source ==) à la REPL (avec repl-utils require'd, bien sûr), == des appels à l' equiv méthode de clojure.lang.Numbers. Pertinentes bits de clojure/lang/Numbers.java (à partir de la dernière ou de la proximité du dernier commit sur GitHub):

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

Utiliser = pour l'égalité des comparaisons de choses qui peuvent ne pas être les chiffres. Lorsque vous sont en fait jongler avec les chiffres, == devrait être un peu plus rapide.

7voto

David Points 186

== est un moyen indépendant du type de comparer des nombres

 (== 3 3.0)
;=> true

(= 3 3.0)
;=> false
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X