如何阅读源码
以下是 Rust 文档为例
读Rust代码的基本顺序:
- 从
crate的大纲开始, 先了解目标代码能干什么,怎么用. - 学习核心
trait, 看看它支持哪些功能. - 掌握主要的数据结构, 开始写一些示例代码
- 围绕自己感兴趣的情景深入阅读.
1. 从大纲开始
Rust 几乎所有库的文档都在 docs.rs 下, 比如 Bytes 的文档可以通过 docs.rs/bytes 访问
- trait
- struct
- 函数/方法
和写代码的思考方式非常类似:
- 先从需求的流程中敲定系统的行为, 需要定义什么接口 trait;
- 再考虑系统有什么状态, 定义了哪些数据结构 struct;
- 最后到实现细节, 包括如何为数据结构实现 trait、数据结构自身有什么算法、如何把整个流程串起来等等.
2. 熟悉核心 trait 的行为
所以先看 trait, 我们以 Buf trait 为例. 点进去看文档, 主页面给了这个 trait 的定义和一个使用示例.
左侧导航栏的 “required Methods” 和 “Provided Methods”, 前者是实现这个 trait 需要实现的方法, 后者是缺省方法.
导航栏继续往下拉, 可以看到 bytes 为哪些 “foreign types” 实现了 Buf trait, 以及当前模块有哪些 implementors.
可以学习到高手定义 trait 的一些思路:
- 定义好
trait后, 可以考虑一下标准库的数据结构, 哪些可以实现这个 trait. - 如果未来别人的某个类型
T, 实现了你的trait, 那他的&T、&mut T、Box等衍生类型, 是否能够自动实现这个 trait.
3. 掌握主要的 struct
和 trait 类似的, 在左侧的导航栏, 有一些值得关注的信息:这个数据结构有哪些方法 (Methods) 、实现了哪些 trait (Trait implementations) , 以及 Auto trait / Blanket trait 的实现. 可以看到, Bytes 除了实现了刚才讲过的 Buf trait 外, 还实现了很多标准 trait.
所以: 我们自己的数据结构, 也应该尽可能实现需要的标准 trait, 包括但不限于:AsRef、Borrow、Clone、Debug、Default、Deref、Drop、PartialEq/Eq、From、Hash、IntoIterator (如果是个集合类型) 、PartialOrd/Ord 等