Clojure 类型扩展与自定义类型详解
1. 扩展现有类型
在 Clojure 中,我们可以将协议扩展到现有的类型上。首先,我们来看一个简单的矩阵协议 Matrix 的实现,这里针对向量的向量(vectors of vectors)进行实现:
(extend-protocol Matrix
clojure.lang.IPersistentVector
(lookup [vov i j]
(get-in vov [i j]))
(update [vov i j value]
(assoc-in vov [i j] value))
(rows [vov]
(seq vov))
(cols [vov]
(apply map vector vov))
(dims [vov]
[(count vov) (count (first vov))]))
下面详细解释 extend-protocol 函数:
- 第一个参数是协议的名称,这里是 Matrix 。
- 后面交替出现符号(表示类型名称,如 IPersistentVector )和列表(该类型针对扩展协议的方法实现)。
协议的方法实现和普通函数类似,与 Ruby 或 Java 不同,这里没有隐式的 self 或 this ,决定协议实现调度的第一个参数会显式地作为方法的第一个参
超级会员免费看
订阅专栏 解锁全文
115

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



