<<<<<<< HEAD Clojure MultiMethods ======= Clojure MultiMethods >>>>>>> 24b6b53 ( 【init】) <<<<<<< HEAD
UP | HOME
<<<<<<< HEAD
=======
>>>>>>> 24b6b53 ( 【init】)

Clojure MultiMethods

multimethods 用来替换 cond,写起来更加的简洁。

multimethods 对应的应该是java的多态,类似同一个接口,有多种实现形式。

但是这里的语法格式,函数名称是不变的。

语法:

(defmulti name dispatch-fn & options)
(defmethod multifn dispatch-value & fn-tail)

使用样例:

(defn amount [per user]
  (float (* 0.01 per (:s user))))
(defmulti f :ref)
(defmethod f :a [user]
  (amount 0.1 user))
(defmethod f :b [user]
  (amount 0.2 user))
(defmethod f :default [user]
  (amount 0.3 user))
(def user1 {:ref :a, :s 10})
(def user2 {:ref :b, :s 20})
(def user3 {:ref :d, :s 30})
(f user1)
(f user2)
(f user3)

如果f函数不设置 :default,那么使用就会抛一个异常出来。

:default 的另一种使用方式:

(defmulti f :ref :default :dd)
(defmethod f :dd [user]
  (amount 0.3 user))

按照语法,defmulti 中, name 之后是: dispatch-fn,意味着这是一个分派函数,这里可以是一个函数(该函数接收 defmethod 的参数,返回值,作为 defmethod 的 dispatch-value 使用)。