《Rust编程之道》学习地图
严格按张汉东《Rust编程之道》13章建立学习坐标,把语言、类型、内存、所有权、工程、并发、元编程和unsafe连成可验证主线。
从“十个主题页”的缺口开始
先预测:如果只有十个主题页,能否证明第4章内存管理与第10章模块化开发已经覆盖?答案是否定的。
本书不是一本只讲所有权、并发和宏的速查册。出版社版本与作者示例代码都把内容组织为13章:新时代的语言、语言精要、类型系统、内存管理、所有权系统、函数闭包和迭代器、结构化编程、字符串与集合、构建健壮的程序、模块化开发、安全并发、元编程、超越安全边界。要求每一章有独立入口,不能把第4章内存管理压成生命周期附录,也不能把第11章异步部分拆成无来源的第14章。
这13章的深层问题始终相同:一个值怎样表示,谁拥有它,谁可以访问它,失败如何穿过边界,编译器能证明什么,剩下哪些条件需要程序员证明。读者不应把“代码能运行一次”当成掌握;必须能在修改输入、owner、线程和外部协议后,预测程序在哪一阶段失败。
第一段:第1至3章建立语言和类型坐标
第1章解释Rust缘起与设计哲学:内存安全、零成本抽象和实用主义不是三个口号,而是编译器、库与工程取舍的共同约束。第2章建立语句与表达式、绑定、函数闭包、模式匹配、基础复合类型、集合、智能指针、泛型Trait和错误处理的语法地图。第3章进入类型系统,比较多态、类型大小与推导、泛型、Trait bound、关联类型、标记Trait、转换、孤儿规则和表达能力。
用于回答“错误发生在parse、类型检查、借用检查、链接还是运行期”。如果连阶段都无法定位,直接谈性能或unsafe没有意义。
fn twice<T, F>(value: T, mut f: F) -> T
where
F: FnMut(T) -> T,
{
f(f(value))
}第二段:第4至5章连接表示、释放与访问许可
第4章先看栈、堆、静态区、size、alignment、padding、智能指针、RAII、泄漏和复合类型布局。第5章再把绑定、作用域、移动、借用、生命周期参数与省略、Rc、Weak、Cell、RefCell、Cow、并发安全和NLL组织成所有权系统。这个顺序很重要:生命周期只描述引用关系,不能替代内存布局和资源释放模型。
应能解释每次move后旧绑定为何不可用、每个引用为何仍有效,以及Rc环为何内存安全却可能泄漏。
use std::rc::{Rc, Weak};
struct Node {
parent: Weak<Node>,
}
let root = Rc::new(Node { parent: Weak::new() });
assert_eq!(Rc::strong_count(&root), 1);第三段:第6至10章把机制变成工程接口
第6章研究函数项、闭包捕获、Fn族、Iterator与IntoIterator;第7章用结构体、枚举、析构顺序、Builder、Visitor和RAII组织程序;第8章处理UTF-8字符串、char、Vec、映射、集合和容量;第9章区分Option、Result与panic并封装第三方错误;第10章用Cargo、package、crate、workspace、模块、可见性和CSV功能包建立可发布边界。
让调用者不必阅读实现也能安全组合模块。工程能力不是“会用Cargo命令”,而是能删除构建产物后按锁定依赖重建,并从错误链追到输入坐标。
第四段:第11至13章审计并发、生成代码与外部内存
第11章覆盖线程、事件、异步、协程、Send/Sync、锁、条件变量、屏障、原子、通道、内部可变性、线程池、Rayon、Crossbeam、Future、async/await和SIMD。第12章讨论Any、向下转型、声明宏、过程宏与编译过程。第13章才进入裸指针、static、union、安全抽象、型变、无界生命周期、dropck、NonNull、panic安全、分配、FFI、动态语言和WebAssembly。
不能用“unsafe块很小”替代证明;小块只是让非空、对齐、初始化、别名、生命周期和释放协议更容易逐项审计。
预测、执行、扰动、解释
每章先写可证伪预测,再固定toolchain执行;随后扰动边界,例如把owned值改成borrow、让输入无效、让线程提前关闭或让FFI返回空指针;最后脱离页面重画状态。比阅读时长和通过一道选择题更可靠。
fn parse_port(raw: &str) -> Result<u16, String> {
let port = raw.parse::<u16>().map_err(|e| e.to_string())?;
(port != 0).then_some(port).ok_or_else(|| "port 0 is reserved".into())
}本章回顾
全书按13章从语言哲学走到安全边界。前五章建立值、类型、内存与owner;第6至10章建立抽象和工程;第11至13章处理并发、代码生成和编译器无法独立证明的边界。任何故障都应先定位官方章节坐标,再定位最早失效的不变量。