使用defmulti dispatch函数时出现问题

时间:2016-09-30 13:14:14

标签: clojure

我已经在clojure中写了这个多功能。

(defmulti printlmt (fn [s] (> (count s) 10)))
(defmethod printlmt true [s] (println s))
(defmethod printlmt false [s] (println (take 10 s)))
然后我尝试执行它,如下所示..

(printlmt "test")

但是,我一直收到以下错误。

IllegalArgumentException No method in multimethod 'printlmt' for dispatch value: 4  clojure.lang.MultiFn.getFn (MultiFn.java:156)

根据我的理解,匿名函数应该返回值true。为什么匿名函数返回4?

如果我单独调用调度函数,就像这样

((fn [s] (> (count s) 0)) "test")

在这种情况下,它会返回true

编辑: 我正在添加我的终端文本:

startingclojure.core=> (defmulti printlmt (fn [s] (> (count s) 10)))
nil
startingclojure.core=> (defmethod printlmt true [s] (println s))
#object[clojure.lang.MultiFn 0x3315fe88 "clojure.lang.MultiFn@3315fe88"]
startingclojure.core=> (defmethod printlmt false [s] (println (take 10 s)))
#object[clojure.lang.MultiFn 0x3315fe88 "clojure.lang.MultiFn@3315fe88"]
startingclojure.core=> 

startingclojure.core=> (printlmt "test")

IllegalArgumentException No method in multimethod 'printlmt' for dispatch value: 4  clojure.lang.MultiFn.getFn (MultiFn.java:156)
startingclojure.core=> 

1 个答案:

答案 0 :(得分:2)

如果您不想重新启动repl以重新定义方法,请使用remove-method

https://clojuredocs.org/clojure.core/remove-method

(remove-method printlmt true)

然后重新定义。

修改
你可以使用

(ns-unmap *ns* 'printlmt)

注意: ns-unmap也需要重新定义所有方法。