m0s*_*it0 3 clojure multimethod
我能理解这是如何工作的:
(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
Run Code Online (Sandbox Code Playgroud)
但是,通过简单地改变: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
Run Code Online (Sandbox Code Playgroud)
使用逆时针插件的Eclipse上的Clojure 1.5.1
Multimethods不喜欢使用新的调度函数重新定义.这是一个颇具争议的特征,但事情就是这样.要更改多方法的调度函数,必须首先将其定义为非多方法(例如,为nil).
(defmulti area :Shape)
(def area nil)
(defmulti area :Shap)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
93 次 |
最近记录: |