在 REPL 上,如果我定义:
(def fits (map vector (take 10 (iterate inc 0))))
然后调用
(== [2] (nth fits 2))
我得到了 false。
但是
(= [2] (nth fits 2))
返回 true。
这是期望的吗?我尝试了(class [2])和(class (nth fits 2)),两者都返回持久向量(Persistent Vector)。
在 REPL 上,如果我定义:
(def fits (map vector (take 10 (iterate inc 0))))
然后调用
(== [2] (nth fits 2))
我得到了 false。
但是
(= [2] (nth fits 2))
返回 true。
这是期望的吗?我尝试了(class [2])和(class (nth fits 2)),两者都返回持久向量(Persistent Vector)。
==
用于比较数字。如果其中任意一个参数不是数字,则始终返回 false:
(== :a :a)
; => false
你可以在REPL中使用 (clojure.contrib.repl-utils/source ==)
命令(当然需要先加载 repl-utils
),可以看到 ==
调用了 clojure.lang.Numbers
的 equiv
方法。以下是来自 GitHub 最新或接近最新提交的 clojure/lang/Numbers.java
的相关部分:
static public boolean equiv(Object x, Object y){
return y instanceof Number && x instanceof Number
&& equiv((Number) x, (Number) y);
}
对于可能不是数字的事物进行相等性比较时,请使用=
。当您确实处理数字时,==
应该会更快一些。
“==”是一种类型无关的比较数字的方式。
(== 3 3.0)
;=> true
(= 3 3.0)
;=> false