学习路线
本章定位:在读任何语法之前,先把「怎么学、学到哪、怎么验证环境」讲清楚。 前置知识:任意一门编程语言(Python / Java / C# / JS / C++ / Go 均可)。
本章目标
- 能说清 Rust 的能力边界:它解决什么问题,不解决什么问题。
- 理解本站的组织方式与三条学习路径,选定自己的路径。
- 用一段脚本一次性验证本机工具链(
rustc/cargo/rustup/rustfmt/clippy)可用。 - 建立「编译期思维」:Rust 把大量运行时问题前移到编译期,报错是设计的一部分,不是障碍。
Rust 是什么:一张定位表
Rust 是一门编译型、静态类型、无垃圾回收的系统级语言。它的核心卖点不是「快」(快只是结果),而是:
在没有 GC 的前提下,用编译期检查消除内存错误与数据竞争。
这句话拆开是三件事:
- 无 GC:内存的释放时机由所有权规则在编译期决定,运行期没有追踪式回收器(对比 Java/Python/Go)。
- 内存安全:空指针、悬垂指针、双重释放、缓冲区溢出在安全代码里不可能发生(不是「很难发生」,是编译不过)。
- 无畏并发:数据竞争(data race)同样是编译期错误。
它和其他语言的关系
| 语言 | 内存管理 | 类型检查 | 并发安全保证 | 典型定位 |
|---|---|---|---|---|
| C / C++ | 手动 / RAII | 编译期(弱) | 无 | 极致控制,错误代价高 |
| Rust | 编译期所有权 + RAII | 编译期(强) | 编译期排除数据竞争 | 「C++ 的性能,编译期的安全」 |
| Go | 并发 GC | 编译期(接口宽松) | 运行期 -race 检测 | 网络服务,简单优先 |
| Java / C# | 分代 GC | 编译期 + 运行期 | 运行期检测为主 | 企业应用,JIT 优化 |
| Python / Ruby | 引用计数 + GC | 运行期(鸭子类型) | GIL 掩盖了部分问题 | 脚本、数据、胶水 |
| JS / TS | GC | TS 编译期(可逃逸) | 单线程事件循环为主 | 前端与 Node 服务 |
💡 对照:如果你写过 C++,Rust 的
Box<T>≈std::unique_ptr、Rc<T>≈std::shared_ptr(但不处理循环)、Arc<T>≈ 线程安全的shared_ptr、Drop≈ 析构函数、move语义 ≈ 右值引用 + 移动构造且默认生效。 如果你写过 Java,最大的心智冲击是:赋值可能让原变量失效(move),以及没有null(用Option<T>代替)。
Rust 不擅长什么(提前说清楚)
- 极致编译速度:单态化 + 借用检查让编译比 Go 慢得多;大项目
cargo check常需数十秒到数分钟。 - 快速原型:严格类型与所有权会让「先随便写写」变慢(但后期重构更快)。
- 学习曲线:前两周通常是最难受的,〈所有权〉和〈泛型与生命周期〉是两道坎。
学 Rust 的正确姿势(针对有经验的人)
你已经会别的语言,所以真正的难点不是「语法」,而是三件事:
- 改掉旧习惯:不要先写出来再想借用问题。Rust 要求你先想清楚「谁拥有这份数据、谁只是借用」。
- 把报错当文档读:rustc 的错误信息质量是同类语言里最好的,每一条都带
help:。不要绕过报错,要读懂它。 - 接受「编译期付出,运行期收获」:Rust 的很多设计(显式
clone()、?、mut标记)是在让代价可见,不是啰嗦。
三条具体建议:
- 每章练习必须手敲:阅读获得的「我懂了」是幻觉,编译通过才算懂。
- 不要过早用
clone()止血:先用clone()让程序跑起来是可以的,但跑通后必须回头想这一段该不该 clone。〈所有权〉一章会专门讲这个方法论。 - 不要一开始就学 async:async 会同时考验所有权、生命周期、trait、闭包,基础不牢会变成「背 API」。按目录顺序来。
⚠️ 陷阱:不要用 AI/搜索「直接给我能跑的完整代码」来解决练习。Rust 的收益恰恰来自你被借用检查器拦住的那几十次。
三条学习路径
| 路径 | 顺序 | 适合 |
|---|---|---|
| 快速上手 | 学习路线 → 环境搭建 → 变量与流程控制 → 所有权 → 结构体与 trait → 错误处理 → 工程化(模块 / serde / clap 部分) | 想尽快写出能用的命令行工具 |
| 系统学习 | 从学习路线到〈测试、性能与 unsafe〉全部读完,练习全做 | 想真正掌握这门语言(推荐) |
| Async 后端 | 学习路线 → 变量与流程控制 → 所有权 → 结构体与 trait → 错误处理 → 泛型与生命周期 → 智能指针与闭包 → 并发 → 异步 → 工程化 | 目标是 axum/sqlx 写服务 |
时间预期(每天 2 小时):
- 路径 1:约 2 周
- 路径 2:约 8 周(〈所有权〉〈泛型与生命周期〉〈异步编程〉三章各留出额外 2~3 天反复读)
- 路径 3:约 6 周
每章最后的「练习与自测」页里有一份自测清单,全部勾完再进入下一章;配合下面的 8 周表安排节奏。
学习节奏建议(8 周表)
| 周 | 内容 | 交付物(自测) |
|---|---|---|
| 1 | 学习路线、环境搭建、变量与流程控制 | 能解释「语句 vs 表达式」,能写带 match 的小程序 |
| 2 | 〈所有权〉一章(重点) | 能徒手说出 E0382/E0502 的成因与至少两种修法 |
| 3 | 结构体与 trait、集合与迭代器 | 能用 enum + trait 建模一个领域对象;能用迭代器完成词频统计 |
| 4 | 错误处理、泛型与生命周期 | 能设计一个 enum 错误类型并用 ? 贯穿调用链 |
| 5 | 〈智能指针与闭包〉一章 | 能解释 Rc<RefCell<T>> 为什么能绕过借用检查,代价是什么 |
| 6 | 〈并发编程〉一章 | 能用 Arc<Mutex<_>> 写多线程共享状态并解释为何无数据竞争 |
| 7 | 〈异步编程〉一章 | 能用 join!/select!/Semaphore 写并发任务 |
| 8 | 宏、工程化、测试与性能 + 附录 | 能写一个带测试、文档、clap 参数、serde 序列化的小项目 |
建议每周留半天做复习:重读上周章节的「自测清单」,把当时靠猜做对的练习重做一遍。
如何高效查资料
遇到问题时,按这个顺序找答案(顺序很重要,越靠前越权威且越省时间):
- 编译器本身:
cargo check的输出 +cargo explain E0382+rustc --explain E0502。 - 本站附录:附录 B 报错速查(按错误码或症状查)。
- 标准库文档:
rustup doc离线打开(官方);查第三方 crate 的 API 用 docs.rs。 - 官方书与中文教程:The Rust Programming Language 是最权威的入门教材(有社区中文译版);中文社区教程首推 Rust 圣经,专题比官方书更深。
- 例子集、语法规范、unsafe 深入读物、书单与练习平台的完整清单,见附录 D · 学习资源与文档索引。
⚠️ 陷阱:搜索引擎结果常混入旧版本写法(例如
try!宏、#[async_trait]已成为历史方案、lazy_static已被std::sync::LazyLock取代)。判断标准:优先看doc.rust-lang.org与 crate 的docs.rs页面顶部的版本号。
延伸阅读
- 同一概念的第二种讲法(官方书中文版、Rust 圣经的逐章映射),见 附录 E · 对照阅读与组合学习法。
- 官方文档、中文资料、书单与工具的完整索引,见 附录 D · 学习资源与文档索引。