Kon*_*rus 0 clojure multimethod
假设我有这种多方法
(defmulti m (fn [v] [(:type v)]))
(defmethod m [Object] [k] (prn "Object"))
(defmethod m [:mykwd] [k] (prn "mykwd"))
Run Code Online (Sandbox Code Playgroud)
当我用子类调用它时Object
,它会正确地调度到第一个实现:
(m {:type String})
"Object"
Run Code Online (Sandbox Code Playgroud)
随着:mykwd
它也按预期工作:
(m {:type :mykwd})
"mykwd"
Run Code Online (Sandbox Code Playgroud)
但当我提供另一个关键字时,我得到一个例外:
(m {:type :anotherkwd})
#<CompilerException java.lang.IllegalArgumentException: No method in multimethod 'm'
for dispatch value: [:anotherkwd] (NO_SOURCE_FILE:0)>
Run Code Online (Sandbox Code Playgroud)
这个调度究竟是如何工作的?
是否可以为类继承保留此行为,并且仍然具有捕获所有关键字的"默认"实现?
编辑这个例子很简单,但我需要它来处理二进制函数.我的真正需求如下.我不知道如何申请:default
它.
(defmulti m (fn [arg mp] [(class arg) (:type mp)]))
Run Code Online (Sandbox Code Playgroud)
然后,我正在寻找一种方式,当定义它的情况arg
是nil
和(:type mp)
是什么.这适用于value for :type
是一个类,但不适用于任何关键字:
(defmethod m [nil Object] [arg mp] (prn "Whatever"))
Run Code Online (Sandbox Code Playgroud)
有一个默认值:
(defmethod m :default [x] :oops)
Run Code Online (Sandbox Code Playgroud)
参考:
查看页面底部的http://clojure.org/multimethods.