2010-03-02 14 views
32

Na REPL, gdybym definiują= i == w Clojure

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

a następnie zadzwonić

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

dostaję fałszywe.

Ale

(= [2] (nth fits 2)) 

zwraca true.

Czy to jest oczekiwane? Próbowałem (klasa [2]) i (klasa (uruchamianych n pasuje: 2) i zwracają Persistent Vector

Odpowiedz

55

== jest do porównywania liczb Jeśli któryś z jego argumentów nie jest liczbą, to zawsze return false..

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

Jak widać, mówiąc (clojure.contrib.repl-utils/source ==) w REPL (z repl-utilsrequire „d, oczywiście), == wywołuje metodę clojure.lang.Numbersequiv. Odpowiednia trochę clojure/lang/Numbers.java (od najnowszych lub blisko do najnowszej popełnić na GitHub):

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

Użyj porównania = dla porównań rzeczy, które mogą nie być liczbami. Kiedy w rzeczywistości zajmujesz się liczbami, == powinno być nieco szybsze.

+0

Dzięki Michała! –

+1

Nie ma za co. :-) –

7

== jest rodzajem niezależny sposób porównywania liczb

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false