在Clojure中=和==

Aru*_*n R 32 clojure

在REPL上,如果我定义

(def fits (map vector (take 10 (iterate inc 0))))
Run Code Online (Sandbox Code Playgroud)

然后打电话

(== [2] (nth fits 2))
Run Code Online (Sandbox Code Playgroud)

我弄错了.

(= [2] (nth fits 2))
Run Code Online (Sandbox Code Playgroud)

返回true.

这是预期的吗?我试过(class [2])和(class(nth fit 2)并且都返回Persistent Vector.

Mic*_*zyk 55

==用于比较数字.如果它的任何一个参数不是数字,它将始终返回false:

(== :a :a)
; => false
Run Code Online (Sandbox Code Playgroud)

正如你(clojure.contrib.repl-utils/source ==)在REPL中所说的那样(repl-utils require当然是'd),==调用equiv方法clojure.lang.Numbers.相关的一点clojure/lang/Numbers.java(来自GitHub上的最新或接近最新的提交):

static public boolean equiv(Object x, Object y){
    return y instanceof Number && x instanceof Number
           && equiv((Number) x, (Number) y);
}
Run Code Online (Sandbox Code Playgroud)

用于=对可能不是数字的事物进行相等比较.当你实际上处理数字时,==应该更快一些.


Dav*_*vid 7

==是一种比较数字的类型无关的方式

(== 3 3.0)
;=> true

(= 3 3.0)
;=> false
Run Code Online (Sandbox Code Playgroud)