私はこのマルチ関数を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
を返します!
編集:私は私が持っている端末のテキストを追加している :あなたがメソッドを再定義するために、あなたのREPLを再起動したくない場合は
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の古い誤った定義はまだここにあります –