我有一些使用多方法的代码,并且理想情况下希望重载函数(在本例中为多功能函数),以便我可以传递更高阶的函数来帮助进行测试。是否有可能超载Clojure多方法的arity?
这里的例子:
(ns multi)
(defn my-print [m] (println "The colour is" (:colour m)))
(defmulti which-colour-mm (fn [m f] (:colour m)))
(defmethod which-colour-mm :blue [m f] (f m))
(defmethod which-colour-mm :red [m f] (f m))
(defmethod which-colour-mm :default [m f] (println "Default: Neither Blue nor Red"))
(defn which-colour
([m] (which-colour-mm m my-print))
([m f] (which-colour-mm m f)))
(which-colour {:colour :blue :object :ball})
(which-colour {:colour :yellow :object :ball})
(which-colour {:colour :blue :animal :parrot} (fn [m] (println "The " (:animal m) "is" (:colour m))))
所以我DEFN提供的元数超载,但我不知道是否defmethod支持这样的事。 (我猜你不想为每个defmethod声明做。)
这是最合适的(我敢说,惯用)的方法,还是有更好的方法吗?
我喜欢这一点,并ANKUR的回答,但是这一次使用的元数超载v另一个使用参数计数来匹配调度值。如果你想为每个调度值使用相同的默认函数(并避免重复),而在defmethod级别进行重载,如果你想为每个调度值设置不同的默认值,我想使用defn方法是有意义的。 – 2012-04-26 04:28:17