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 使用)。