深入探索 Clojure 多方法:从基础到层级应用
1. 多方法概述
多方法是一种强大的编程概念,它极大地扩展了调度的灵活性。与之前讨论的基于类型的单调度协议不同,多方法不仅支持多调度,还能基于参数的任意属性进行调度,而不是仅仅依赖于参数类型。这意味着在调用多方法时,可以根据参数的任意属性来选择合适的实现,且不会对某个参数有特殊的优先级。此外,多方法还支持任意层级结构,并能处理多重继承的歧义问题。
1.1 与 Java 方法重载的对比
在 Java 中,一个方法名可以有多个长度相同但参数类型不同的签名,这种情况被称为方法重载。然而,这并不等同于多调度。在 Java 中,正确的签名是在编译时根据方法参数的类型来选择的,唯一的动态调度是基于特权参数 this 的类型。
2. 多方法基础
2.1 多方法的创建与实现
多方法使用 defmulti 形式创建,其实现则通过 defmethod 形式提供。可以这样记忆:它们的顺序与 “multimethod” 这个词本身的顺序一致,即先定义多调度,然后定义调度到的方法。
以下是一个示例,展示了一个用于填充 XML/HTML 节点的函数,其行为取决于标签名:
(defmulti fill
"Fill a xml/html node (as per clojure.xml)
with the provided value."
(fn [node value] (:tag
超级会员免费看
订阅专栏 解锁全文
578

被折叠的 条评论
为什么被折叠?



