Подтвердить что ты не робот

= и == в Clojure

В REPL, если я определяю

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

а затем вызовите

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

Я получаю false.

Но

(= [2] (nth fits 2))

возвращает true.

Ожидается ли это? Я попробовал (класс [2]) и (класс (nth соответствует 2) и оба возвращают Persistent Vector.

4b9b3361

Ответ 1

== предназначен для сравнения чисел. Если любой из его аргументов не является числом, он всегда будет возвращать false:

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

Как вы можете видеть, говоря (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);
}

Используйте = для сравнения сравнений вещей, которые могут не быть числами. Когда вы на самом деле имеете дело с числами, == должен быть несколько быстрее.

Ответ 2

== - независимый от типа способ сравнения чисел

(== 3 3.0)
;=> true

(= 3 3.0)
;=> false