2010-03-02 10 views
32

Auf REPL, wenn ich= und == in Clojure

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

definieren und dann

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

nenne ich falsch bekommen.

Aber

(= [2] (nth fits 2)) 

gibt true zurück.

Wird das erwartet? Ich habe versucht, (Klasse [2]) und (Klasse (n fits 2) und beide Rück Persistent Vector

Antwort

55

== ist Zahlen zum Vergleichen Wenn eines seiner Argumente nicht eine Zahl ist, es wird immer false zurück..

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

Wie Sie sagen, (clojure.contrib.repl-utils/source ==) am REPL (mit repl-utilsrequire ‚d, natürlich) sehen können, == ruft die equiv Methode clojure.lang.Numbers. die entsprechende Bit von clojure/lang/Numbers.java (aus dem aktuellen oder close-to-latest verpflichten auf GitHub):

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

Verwenden Sie = für Gleichheitsvergleiche von Dingen, die möglicherweise keine Zahlen sind. Wenn Sie sich tatsächlich mit Zahlen beschäftigen, sollte == etwas schneller sein.

+0

Dank Michal! –

+1

Gern geschehen. :-) –

7

== ist eine Art unabhängige Art und Weise zu vergleichen Zahlen

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false