= and == in Clojure
clojure
Solution
`==` is for comparing numbers. If either of its arguments is not a number, it will always return false:
(== :a :a)
; => false
As you can see by saying `(clojure.contrib.repl-utils/source ==)` at the REPL (with `repl-utils` `require`'d, of course), `==` calls the `equiv` method of `clojure.lang.Numbers`. The relevant bit of `clojure/lang/Numbers.java` (from the latest or close-to-latest commit on GitHub):
static public boolean equiv(Object x, Object y){
return y instanceof Number && x instanceof Number
&& equiv((Number) x, (Number) y);
}
Use `=` for equality comparisons of things which may not be numbers. When you are in fact dealing with numbers, `==` ought to be somewhat faster.
Problem
On REPL, if I define ``` (def fits (map vector (take 10 (iterate inc 0)))) ``` and then call ``` (== [2] (nth fits 2)) ``` I get false. But ``` (= [2] (nth fits 2)) ``` returns true. Is this expected ? I tried (class [2]) and (class (nth fits 2) and both return Persistent Vector.