= и == в Clojure - PullRequest
       30

= и == в Clojure

32 голосов
/ 02 марта 2010

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

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

, а затем позвоните

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

Я получаю ложь.

Но

(= [2] (nth fits 2))

возвращает истину.

Это ожидается? Я пробовал (класс [2]) и (класс (подходит для 2-го числа) и оба возвращают постоянный вектор.

Ответы [ 2 ]

55 голосов
/ 02 марта 2010

== для сравнения чисел. Если один из его аргументов не является числом, он всегда будет возвращать 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);
}

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

7 голосов
/ 31 октября 2012

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

(== 3 3.0)
;=> true

(= 3 3.0)
;=> false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...