2017-10-12 122 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

另一种选择是“(实例?录制)”。 –