0

假设我有这个多方法

(defmulti m (fn [v] [(:type v)]))

(defmethod m [Object] [k] (prn "Object"))

(defmethod m [:mykwd] [k] (prn "mykwd"))

当我用 的子类调用它时Object,它会正确调度到第一个实现:

(m {:type String})
"Object"

使用:mykwd它也可以按预期工作:

(m {:type :mykwd})
"mykwd"

但是当我提供另一个关键字时,我得到了一个例外:

(m {:type :anotherkwd})
#<CompilerException java.lang.IllegalArgumentException: No method in multimethod 'm'
for dispatch value: [:anotherkwd] (NO_SOURCE_FILE:0)>

这个调度究竟是如何工作的?

是否可以为类继承保留这种行为,并且仍然有一个捕获所有关键字的“默认”实现?

编辑这个例子很简单,但我需要它来处理二进制函数。我真正的需要在下面。我不知道我该如何申请:default

(defmulti m (fn [arg mp] [(class arg) (:type mp)]))

然后我正在寻找一种方法来定义它何时argnil(:type mp)是什么的情况。这适用于 value for:type是一个类,但不适用于任何关键字:

(defmethod m [nil Object] [arg mp] (prn "Whatever"))
4

2 回答 2

5

有一个默认值:

(defmethod m :default [x] :oops)

参考:

检查页面底部的http://clojure.org/multimethods 。

于 2011-03-23T18:32:22.843 回答
2

尝试使用在is:type时返回默认值的自定义函数替换您的调度。对. 然后,您可以发送关键字向量。如果您需要继承行为,请将关键字添加到层次结构中。:typenilclass

于 2011-03-23T23:49:19.147 回答