我已经用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=> 发布于 2016-10-01 02:31:32
如果不想为重新定义方法重新启动repl,请使用remove-method
https://clojuredocs.org/clojure.core/remove-method
(remove-method printlmt true)然后重新定义。
编辑
您可以使用
(ns-unmap *ns* 'printlmt)注意: ns-unmap也需要重新定义所有方法。
https://stackoverflow.com/questions/39792430
复制相似问题