面向 C/C++ 程序员的 Rust 入门强化课程 🟢
欢迎参加 Rust 入门强化课程。本课程专为具备 C/C++ 背景、希望利用其系统编程经验的高级开发者设计,旨在帮助你拥抱 Rust 的安全特性与现代功能。
课程概览
- 为什么选择 Rust:C/C++ 开发者为何需要 Rust 以及它能消除哪些常见问题。
- 基础知识:类型、函数、控制流以及模式匹配。
- 工具链:模块、Cargo 以及工作空间(Workspaces)。
- 抽象能力:Trait、泛型以及闭包。
- 内存与并发:生命周期、智能指针以及线程安全。
- 系统与 FFI:Unsafe Rust、外部函数接口(FFI)以及
no_std。 - 案例研究:将 C++ 代码迁移到 Rust 的真实架构设计模式。
Note
本课程 不 涉及
asyncRust。如需深入学习 Future、执行器(Executors)以及tokio,请参阅配套的 Async Rust Training。
自学指南
| 阶段 | 主题 | 建议时长 | 检查点 |
|---|---|---|---|
| 1 | 环境搭建、类型、控制流 | 1 天 | 构建一个命令行计算器。 |
| 2 | 数据结构、所有权 | 1-2 天 | 理解为何 let s2 = s1 会移动 s1。 |
| 3 | 模块、错误处理 | 1 天 | 使用 ? 操作符传播错误。 |
| 4 | Trait、泛型、闭包 | 1-2 天 | 编写带有 Trait 约束的泛型函数。 |
| 5 | 并发、Unsafe/FFI | 1 天 | 创建一个线程安全的计数器。 |
如何使用练习
每章都包含带难度标记的动手练习:
- 🟢 入门 (Starter)
- 🟡 中级 (Intermediate)
- 🔶 挑战 (Challenge)
提示:务必先独立尝试练习至少 15 分钟。与借用检查器(Borrow Checker)的“博弈”就是实际学习发生的地方。如果卡住了,请研究参考答案,然后尝试从头开始重写。
目录
第一部分 — 基础篇
1. 引言与动机
2. 快速开始
3. 基础类型与变量
4. 控制流
5. 数据结构与集合
- 数组类型
- 元组 (Tuples)
- 引用 (References)
- C++ 引用 vs Rust 引用 — 关键区别
- 切片 (Slices)
- 常量与静态变量
- Rust 字符串:String vs &str
- 结构体 (Structs)
- Vec<T> 类型
- HashMap 类型
- 练习:Vec 与 HashMap
6. 模式匹配与枚举
7. 所有权与内存管理
- 内存管理概览
- 所有权、借用与生命周期
- 移动语义 (Move Semantics)
- Clone 特征
- Copy 特征
- Drop 特征
- 练习:Move, Copy 与 Drop
- 生命周期与借用深入解析
- 生命周期标注
- 练习:带生命周期的切片存储
- 生命周期省略规则深挖
- Box<T> 智能指针
- 内部可变性:Cell<T> 与 RefCell<T>
- 共享所有权:Rc<T>
- 练习:共享所有权与内部可变性
8. 模块与 Crate
- Crates 与模块概览
- 练习:模块与函数
- 工作空间 (Workspaces) 与软件包
- 练习:使用工作空间与包依赖
- 使用来自 crates.io 的社区 Crate
- 依赖管理与语义化版本 (SemVer)
- 练习:使用 rand Crate
- Cargo.toml 与 Cargo.lock
- Cargo Test 功能
- Cargo 的其他功能
- 测试模式
9. 错误处理
10. Trait 与泛型
- Rust Traits (特征)
- C++ 运算符重载 → Rust std::ops Traits
- 练习:Logger Trait 实现
- 何时使用 enum vs dyn Trait
- 练习:翻译前的思考
- Rust 泛型
- 练习:泛型实战
- 结合使用 Trait 与泛型
- 数据类型中的 Trait 约束
- 练习:Trait 约束与泛型
- 类型状态模式 (Type State Pattern)
- 构建者模式 (Builder Pattern)
11. 类型系统高级特性
12. 函数式编程
13. 并发编程
14. Unsafe Rust 与 FFI
第二部分 — 专题深入
15. no_std — 裸机环境下的 Rust
16. 案例研究:真实的 C++ 到 Rust 迁移
- 案例 1:继承层级 → Enum 派发
- 案例 2:shared_ptr 树 → Arena/索引 模式
- 案例 3:框架通信 → 生命周期借用
- 案例 4:上帝对象 → 可组合状态
- 案例 5:Trait 对象 — 何时才是正确选择