理解多方法分派

3

我能理解这个是如何工作的:

(defmulti area :Shape)
(defmethod area :B [x] (println "Rect"))
(defmethod area :C [x] (println "Circle"))
(defmethod area :default [x] (do (println "Unknown") (:Shape x)))
(area {:Shape :B})
=> Rect
nil
(area {:Shape :Bb})
=> Unknown
:Bb

但是仅仅将:Shape更改为:Shap,我就不明白这是如何被调度的:

(defmulti area :Shap)
(defmethod area :B [x] (println "Rect"))
(defmethod area :C [x] (println "Circle"))
(defmethod area :default [x] (do (println "Unknown") (:Shap x)))
(area {:Shap :B})
=> Unknown
:B
(area {:Shap :C})
=> Unknown
:C

在Eclipse中使用Counterclockwise插件的Clojure 1.5.1。

我在lein的REPL中尝试过它,并且它可以工作,一定是CounterClockwise的问题(我打赌用户命名空间在两个测试之间没有重新初始化)。 - omiel
顺便提一下,你的第一个例子中肯定有错别字:方法定义中的 ::B 关键字要么不应该有命名空间,要么调用示例中的 :B 应该有。 - omiel
1个回答

7

多方法不喜欢使用新的调度函数进行重新定义。这是一个相当有争议的特性,但事实就是如此。若要更改多方法的调度函数,必须首先将其定义为不是多方法的内容(例如nil)。

(defmulti area :Shape)

(def area nil)

(defmulti area :Shap)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接