Clojure 程式設計/示例/API 示例/多方法
外觀
此頁面列出了使用 Clojure API 建立多方法的示例。
(defmulti area :Shape)
(defn rect [wd ht] {:Shape :Rect :wd wd :ht ht})
(defn circle [radius] {:Shape :Circle :radius radius})
(defmethod area :Rect [r]
(* (:wd r) (:ht r)))
(defmethod area :Circle [c]
(* (. Math PI) (* (:radius c) (:radius c))))
(defmethod area :default [x] :oops)
(def r (rect 4 13))
(def c (circle 12))
(area r)
-> 52
(area c)
-> 452.3893421169302
(area {})
-> :oops
這是一個在不使用層次結構的情況下使用多方法的示例
(defmulti rand-str
(fn [] (> (rand) 0.5)))
(defmethod rand-str true
[] "true")
(defmethod rand-str false
[] "false")
(for [x (range 5)] (rand-str))
-> ("false" "false" "true" "true" "false")
(defmulti fib int)
(defmethod fib 0 [_] 1)
(defmethod fib 1 [_] 1)
(defmethod fib :default [n] (+ (fib (- n 2)) (fib (- n 1))))
user=> (map fib (range 10))
(1 1 2 3 5 8 13 21 34 55)
另一個示例,其中defmulti 接受引數並在呼叫defmethod之前對其進行評估
(defmulti multi-fun
(fn [x y] (+ x y)))
(defmethod multi-fun 3 [x y]
(print "Specialisation 3"))
(defmethod multi-fun :default [x y]
(print "Generic " (+ x y)))
user=> (multi-fun 1 2)
Specialisation 3
user=> (multi-fun 3 4)
Generic 7