【问题标题】:case clause doesn't match record typecase 子句与记录类型不匹配
【发布时间】:2017-10-12 02:00:53
【问题描述】:

为什么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 表达式和 test-constant 是相等的:

(= (type rec) Rec)
=> true

【问题讨论】:

    标签: clojure switch-statement record


    【解决方案1】:

    Rec 不是编译时文字。引用https://clojuredocs.org/clojure.core/case:

    所有形式的常量表达式都是可以接受的,包括数字、字符串、符号、关键字以及它们的(Clojure)组合。

    替代方案:

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

    【讨论】:

    • 啊啊啊,毕竟有道理。多年的 C 语言让我认为记录是一个结构(编译时的东西)。感谢您的替代品。我认为 Clojure 将有一个简单的方法来做到这一点,而不需要一直定义一个多方法! :)
    • 没问题。 case 是关于常量的。 cond 是通用的。在我阅读文档之前,我认为记录也是一个常数。也许另一个答案会准确地告诉我们为什么记录不是常数。
    • 还有一个选项是(instance? Rec rec)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多