我已经在clojure中编写了这个多功能函数。使用defmulti调度功能的问题
(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 "[email protected]"]
startingclojure.core=> (defmethod printlmt false [s] (println (take 10 s)))
#object[clojure.lang.MultiFn 0x3315fe88 "[email protected]"]
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=>
我的代码适用于我 – Lee
@Lee我添加了实际的控制台文本。你能否看看是否有什么问题。 – Teddy
这两个代码都没有问题。你有没有试过退出然后重新启动repl?愚蠢的问题,但也许是一个旧的printlmt错误定义仍然在这里 –