主页
主页

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

Author: HeHe

Created: 2018-11-11 日 21:10

Validate