我错过了关于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