2017-10-12 121 views
2

爲什麼case子句不匹配記錄類型?case子句不匹配記錄類型

(defrecord Rec []) 
=> fargish.user.Rec 

(def rec (->Rec)) 
=> #'fargish.user/rec 

(case (type rec) Rec :YES) 
=> IllegalArgumentException No matching clause: class fargish.user.Rec fargish.user/eval25147 (form-init131856794870899934.clj:1) 

如果你想知道,是的,CASE表達式和測試常數相等:

(= (type rec) Rec) 
=> true 

回答

2

Rec不是編譯時的文字。引用來自https://clojuredocs.org/clojure.core/case

在包含數字,字符串,符號,關鍵字和(Clojure)組合的情況下,常量表達式的所有方式均可接受。

替代方案:

(cond 
    (= (type rec) Rec) :YES) 
;;=> :YES 
(condp = (type rec) 
    Rec :YES) 
;;=> :YES 
+0

AHHHH,它有一定道理畢竟。許多年的C讓我想到一個記錄是一個結構(編譯時事物)。感謝您的選擇。我想Clojure會有一個簡單的方法來做到這一點,並不涉及到定義多方法的方法! :) –

+1

沒問題。 'case'是關於常量的。 'cond'是通用的。在閱讀文檔之前,我認爲記錄也是一個常數。也許另一個答案會出現,告訴我們爲什麼一個記錄不是一個常數。 –

+0

另一種選擇是「(實例?錄製)」。 –