我錯過了關於defmulti和defmethod的一個重要觀點。我讀過幾本書對defmulti的解釋,但我仍然感到困惑。構建Clojure defmulti/defmethod
我想這取決於它是否是一個交易或者我想打電話給喜歡100.00
量(隨機VAL),要麼拿回播映反值或隨機小數量得到一個隨機值。我已經嘗試將這些函數放在地圖中,但是我得到了相同的值,以反轉a,b。
(def^:dynamic map-val {:trans (random-trans) :amt (random-amount)})
這是最少量的代碼來顯示我在做什麼,不工作。我會很感激任何指針或幫助。
(def^:dynamic avail-trans [\B \W \D \A])
(defn random-trans
[]
(nth avail-trans (.nextInt random (count avail-trans))))
(defn random-amount
[]
(float (/ (.nextInt random (count (range 1 10000))) 25)))
以下是構造不正確,但我不知道爲什麼或如何來解決這個問題:
(defmulti random-val :val-type)
(defmethod random-val :trans []
(random-trans))
(defmethod random-val :amt []
(random-amount))
調用(random-val :trans)
導致此錯誤:
的java.lang。 IllegalArgumentException:多方法'random-val'中沒有用於分派值的方法:null(NO_SOURCE_FILE:0)
我欣賞的答案非常多。這兩個答案(迄今爲止)比我在Clojure的網站上看到的要好。沒有明智的傢伙打算,但Clojure在我看來是「需要村莊」的語言/學習體驗之一。我從聽所有答案中得到一些東西。 – octopusgrabbus 2011-12-17 17:58:42
你已經說服我不要將這個特殊的例子用於multimethods,但是爲了進行實驗,如果我重新安排了你的例子,我怎麼稱呼它呢? – octopusgrabbus 2011-12-17 18:09:54
我不太確定你在問什麼;你的意思是,如果你想使用multimethods,你會怎麼做?我上面寫的代碼應該按照你的意圖工作。 – Isaac 2011-12-17 23:21:26