2010-03-02 16 views
32

On REPL, nếu tôi xác định= và == trong Clojure

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

và sau đó gọi

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

tôi nhận sai.

Nhưng

(= [2] (nth fits 2)) 

trả về true.

Điều này có được mong đợi không? Tôi cố gắng (lớp [2]) và (lớp (fits thứ n 2) và cả hai trở Vector dai dẳng

Trả lời

55

== là để so sánh các số Nếu một trong hai đối số của nó không phải là một con số, nó sẽ luôn luôn trả về false:..

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

Như bạn có thể nhìn thấy bằng cách nói (clojure.contrib.repl-utils/source ==) tại REPL (với repl-utilsrequire 'd, tất nhiên), == gọi phương thức equiv của clojure.lang.Numbers. các bit có liên quan của clojure/lang/Numbers.java (từ mới nhất hoặc close-to-mới nhất cam kết trên GitHub):

static public boolean equiv(Object x, Object y){ 
    return y instanceof Number && x instanceof Number 
      && equiv((Number) x, (Number) y); 
} 

Sử dụng = để so sánh bình đẳng những thứ có thể không phải là số. Khi bạn đang thực tế giao dịch với các con số, == nên được phần nào nhanh hơn.

+0

Cảm ơn Michal! –

+1

Bạn được chào đón. :-) –

7

== là một loại đường không phụ thuộc vào số so sánh

(== 3 3.0) 
;=> true 

(= 3 3.0) 
;=> false