clojure - defmethod 捕获所有

标签 clojure multimethod

我有一个专门处理两个参数的多方法:

(defmulti get-tag-type (fn [type tag] [type tag]))

拥有类型允许我将不同的 defmethod 调用分组为集合:
(defmethod get-tag-type [::cat 0] [type tag] ::tiger)
(defmethod get-tag-type [::cat 1] [type tag] ::lion)
(defmethod get-tag-type [::cat 2] [type tag] ::jaguar)

(defmethod get-tag-type [::dog 0] [type tag] ::poodle)
(defmethod get-tag-type [::dog 1] [type tag] ::australian-shepherd)
(defmethod get-tag-type [::dog 2] [type tag] ::labrador-retriever)

但是,有时,我想要一个组的全部或默认值,如果其他组都不匹配,则将调用该组:
(defmethod get-tag-type [::dog :default] ::mutt)

但是,除非 tag,否则这不起作用实际上是 :default .

什么是实现这一目标的好方法?

最佳答案

您的调度函数需要知道哪些映射已经定义,以便它可以决定何时使用默认值。 methods函数会将这些映射返回给您。

(defmulti get-tag-type (fn [type tag] 
                         (let [mlist (methods get-tag-type)]
                           (if-let [d (get mlist [type tag])] 
                             [type tag]
                             [type :default]))))

关于clojure - defmethod 捕获所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440253/

相关文章:

clojure - 我可以使用 Clojure 的派生来创建我的 defrecord 类类型的层次结构吗?

role - 为什么 Perl 6 Str 扮演 Positional 角色,如何更改 []?

interface - Nim - 创建实现方法的对象序列

java - Gen-Class 不生成 .class 文件

clojure - Clojure 的科学编程堆栈

clojure - Clojure core.logic 的意外结果(使用 CLP/FD)

C++ 多方法和编译时检测

clojure - 在 Liberator 中返回 201 Created 响应中的 Location header

concurrency - Clojure 中的死简单 Fork-Join 并发