序章:如何学习 Rust 与使用本书
本章目标
读完这一章,你要先建立三个判断:
- Rust 不是“更难的 C++”,它是一门把内存、并发、错误处理显式摆到你面前的系统语言。
- 本书不是语法速查表,而是一条从零基础到能拆工程、写基础轮子的路线。
- 学 Rust 时最重要的不是背规则,而是理解每条规则在保护什么资源、避免什么错误。
它是什么
Rust 是一门系统编程语言。系统编程的意思不是只能写操作系统,而是你可以控制程序如何使用内存、文件、网络、线程和 CPU 时间。你既能写命令行工具,也能写 Web 服务、数据库组件、游戏服务器、嵌入式程序和高性能后端。
Rust 的核心承诺是:在没有垃圾回收器的情况下,让大量内存错误在编译期暴露出来。它通过所有权、借用、生命周期、类型系统和模式匹配,把很多“运行时才炸”的问题提前成“编译器不让过”。
为什么需要
如果你只写脚本语言,很多资源管理细节会被运行时隐藏。隐藏不是坏事,但它会让你在工程变大时看不见成本:内存复制、对象共享、锁竞争、错误丢失、文件句柄泄漏、网络请求阻塞。
Rust 迫使你回答这些问题:
| 问题 | Rust 让你怎么面对 |
|---|---|
| 这个值归谁管 | 所有权 |
| 谁可以临时看它 | 不可变借用 |
| 谁可以修改它 | 可变借用 |
| 错误能不能被忽略 | Result |
| 空值能不能突然出现 | Option |
| 多线程共享会不会数据竞争 | 类型系统与锁 |
这些问题听起来啰嗦,但它们正是工程质量的骨架。
怎么使用
本书推荐你按下面节奏学习:
- 先读一章,不急着写完整项目。
- 把章内代码复制到小文件里运行。
- 故意改坏代码,看编译器如何报错。
- 写完练习,再回到当前 RinBlog 项目观察真实函数。
- 每完成一个部分,做一次“造轮子任务”。
学习时不要把编译错误当失败。Rust 的编译错误通常是教程的一部分:它在告诉你程序哪里没有被清楚地建模。
逐行解释
先看一个最小 Rust 程序:
fn main() {
let message = "Hello, Rust";
println!("{message}");
}
fn表示定义函数。函数是一段可以被调用的代码。main是程序入口。可执行程序启动时会先运行它。()表示参数列表为空。这里的main不接收参数。{ ... }是函数体。Rust 用花括号表示一段作用域。let message = "Hello, Rust";创建一个变量绑定。message绑定到一个字符串字面量。println!("{message}");调用标准库宏,把内容输出到终端。- 每条普通语句用分号结束。分号表示“执行这个动作,不把它当作表达式结果返回”。
这段代码虽然短,但已经有 Rust 的基本味道:入口函数、变量绑定、宏调用、作用域、语句结束。
常见坑
- 一开始不要追求“写得像高手”。能清楚表达意图比炫技重要。
- 不要看到生命周期就慌。生命周期主要是在说明引用必须活得足够久。
- 不要把
unwrap当成习惯。学习时可以用,工程代码里要知道失败时该怎么办。 - 不要跳过编译器提示。Rust 报错通常会给出可操作的建议。
练习
- 新建一个临时目录,运行
cargo new hello-rust。 - 修改
src/main.rs,输出你的名字和今天学 Rust 的目标。 - 删除一处分号,观察编译器提示。
- 把
message改成数字,再观察println!是否仍然工作。
造轮子任务
写一个“学习日志”小程序:程序启动后创建一个字符串变量,里面写今天学到的三个关键词,然后打印出来。暂时不需要读取用户输入,重点是熟悉 Rust 文件、函数和变量。
小结
Rust 的学习曲线来自它不愿意替你隐藏资源管理。你要学会和编译器合作:让类型说明数据长什么样,让所有权说明数据归谁,让错误类型说明失败怎么处理。从下一章开始,我们先把工具链装好,让代码真正跑起来。