我有一个专门处理两个参数的多方法:
(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/