第一章:别怕!Rust不是只有极客才玩得转
如果你第一次听说 Rust,大概率会看到这样的评价:"Rust 连续 8 年蝉联 Stack Overflow 开发者调查'最受喜爱的编程语言'榜首"("Rust has topped Stack Overflow's Most Admired Language survey for 8 consecutive years"),紧接着就是一堆劝退帖:"borrow checker 能让你怀疑人生""所有权机制是编程界的'孔乙己茴字有四种写法'""写个简单的 HTTP 请求要写 200 行代码才能过编译"。如果你是刚入行的新手,或者平时只用 Python、JavaScript 写业务逻辑,看到这些评价大概会直接把 Rust 拉进黑名单——毕竟谁没事愿意给自己找罪受?
> 💡 电子版侧边栏:先澄清一个梗 > 网上流传的"Rust 写 Hello World 要过编译器五关斩六将"其实是个上古时期的梗,早年的 Rust 编译器确实报错晦涩、特性不稳定,但 2024 年的稳定版 Rust 编译器已经友好到离谱:它不会只给你扔一个"非法指令"的报错就完事,反而会像耐心的家教一样,告诉你哪里错了、为什么错、甚至直接把修改后的代码示例甩给你。比如你不小心把 `println!` 拼成 `printn!`,编译器会直接提示: > ``` > error[E0425]: cannot find function `printn` in this scope > --> src/main.rs:2:5 > | > 2 | printn!("Hello, World!"); > | ^^^^^^ not found in this scope > | > = help: did you mean `println!`? > ``` > 这种报错友好度,甚至比很多动态语言的运行时错误提示还贴心。
别急,在本章结束之前,你会亲手写出第一个 Rust 程序,会用不到 5 分钟配好开发环境,还会清清楚楚知道 Rust 到底能帮你做什么、不能帮你做什么——你会发现,那个被传得神乎其神的"极客专属语言",其实离你比你想象中近得多。
---
1.1 Rust 早就不只是写操作系统的极客玩具了
> *Rust is far more than a "geek-only" language for writing operating systems*
很多人对 Rust 的第一印象是"只能写底层系统软件",毕竟 Linux 内核、Windows 内核、Firefox 浏览器引擎这些硬核项目确实都用了 Rust。但实际上,Rust 的应用场景早就覆盖了普通开发者日常能接触到的所有领域,甚至很多你天天用的工具,底层都是 Rust 写的:
1.1.1 你每天都在用的 Rust 工具
> *Rust tools you use every day*
- **命令行工具**:如果你用 Linux 或者 Mac,大概率用过 `ripgrep`(比系统自带的 `grep` 快几十倍的文件搜索工具)、`bat`(带语法高亮和 Git 集成的 `cat` 替代)、`eza`(带图标和排序功能的 `ls` 替代)、`sd`(比 `sed` 更好用的文本替换工具)、`zoxide`(比 `cd` 更智能的目录跳转工具),这些工具全部是用 Rust 写的,编译后是单个二进制文件,不用装任何依赖,下载下来就能跑,速度比 Python 写的同类工具快 10~100 倍。
- **网页后端**:Discord 的后端服务、蚂蚁集团的区块链节点、字节跳动的部分微服务都已经用 Rust 重写,用 Rust 写的后端服务比 Go 版本内存占用低 60%~90%,延迟低 30%~50%,还没有 GC 卡顿问题。
- **桌面应用**:现在流行的轻量桌面应用框架 Tauri 就是用 Rust 写的,用它开发的桌面应用内存占用只有 Electron 应用的 1/10,体积只有 Electron 的 1/5,很多新的笔记软件、剪辑软件都已经在用 Tauri 开发了。
- **游戏开发**:开源的 2D/3D 游戏引擎 Bevy 现在特别火,很多独立游戏开发者用它做小游戏,没有 GC 卡顿,性能比 Unity 还高,而且完全开源免费。
- **嵌入式/物联网**:现在用 Rust 写 ESP32、STM32 等嵌入式设备的程序已经非常成熟了,不用怕内存泄漏、野指针这些 C/C++ 的经典问题,比 C++ 安全得多,很多 Arduino 爱好者都已经开始用 Rust 写硬件小程序了。
1.1.1 10 行代码写出你的第一个 Rust 程序
> *Write your first Rust program in 10 lines of code*
别被"系统编程语言"的标签吓住,Rust 写日常小工具的代码量和 Python 几乎没区别。比如我们写一个最简单的批量重命名工具:把当前目录下所有 `.txt` 后缀的文件改成 `.bak` 后缀,只需要不到 10 行代码: ```rust // 引入标准库的文件系统和路径模块 use std::fs; use std::path::Path;
fn main() { // 遍历当前目录下的所有文件 for entry in fs::read_dir(".").unwrap() { // 获取文件路径 let path = entry.unwrap().path(); // 判断后缀是不是 .txt if path.extension().unwrap_or_default() == "txt" { // 生成新的后缀为 .bak 的路径 let new_path = path.with_extension("bak"); // 重命名文件 fs::rename(&path, &new_path).unwrap(); // 打印重命名结果(双语输出) println!("已重命名 {:?} 为 {:?}", path, new_path); println!("Renamed {:?} to {:?}", path, new_path); } } } ``` 这段代码没有任何复杂的所有权、借用逻辑,甚至不需要你理解 Rust 的核心特性,只要你会一点基础的编程语法,就能看懂它在做什么。把这段代码保存为 `rename.rs`,然后用 Rust 编译器编译: ```bash
编译成可执行文件
rustc rename.rs
运行(Windows下是 rename.exe,Mac/Linux下是 ./rename)
./rename ``` 就能直接批量重命名当前目录下的所有 txt 文件了。如果你觉得每次编译太麻烦,也可以用 Cargo 来管理项目,下一节我们会详细讲。
> 💡 新手小贴士 > 上面的代码里的 `.unwrap()` 是 Rust 处理错误的一种简单方式,相当于"如果出错就直接崩溃",适合写小工具的时候用,正式项目里我们会用更优雅的错误处理方式,这个我们后面会讲。
---
1.2 5 分钟配好 Rust 开发环境
> *Set up your Rust development environment in 5 minutes*
很多编程语言的开发环境配置是新手的第一道坎:比如装 Python 要配环境变量、装 C++ 要配编译器、装 Java 要配 JDK,光配环境就要花一两个小时,还没开始写代码就已经想放弃了。但 Rust 的环境配置已经简化到极致了,全程不用你手动改任何配置,一键就能装好。
1.2.1 用 rustup 一键安装 Rust 工具链
> *Install Rust toolchain with rustup in one click*
Rust 官方提供了一个叫 `rustup` 的工具,它是 Rust 的版本管理器,相当于 Python 的 `pyenv`、Node.js 的 `nvm`,能帮你一键安装 Rust、自动配置环境变量、随时切换 Rust 的稳定版/测试版,不用你手动下载安装包、解压、配路径。
Windows 用户安装步骤
1. 打开浏览器访问 [Rust 官网下载页](https://www.rust-lang.org/tools/install),下载 `rustup-init.exe` 安装程序。 2. 双击运行安装程序,一路点击"下一步"即可,安装程序会自动帮你配置好环境变量,不需要你手动修改。 3. 安装完成后,打开 PowerShell 或者 CMD,输入 `rustc --version`,如果能看到类似 `rustc 1.82.0 (6d8cb0c8a 2024-07-21)` 的版本号,说明安装成功。
Mac/Linux 用户安装步骤
打开终端,运行官方一键安装脚本即可: ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` 安装过程中会提示你选择安装选项,直接按回车选默认的"1"即可。安装完成后,按照提示执行: ```bash
把 Rust 的环境变量加载到当前终端
source "$HOME/.cargo/env" ``` 然后输入 `rustc --version` 验证安装成功即可。
国内用户镜像加速
> *Mirror acceleration for users in China*
如果你在国内安装 Rust 遇到下载慢、超时的问题,可以换成清华大学的开源镜像源,只需要在安装前设置环境变量即可: ```bash
Mac/Linux 国内用户镜像安装
export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Windows 用户可以在安装 rustup-init.exe 的时候,选择"自定义镜像",填入上面的地址即可
``` 用镜像安装的话,整个过程不到 2 分钟就能完成,比装很多其他语言的环境快得多。
1.2.2 用 Cargo 管理你的第一个 Rust 项目
> *Manage your first Rust project with
Cargo 是 Rust 的“全能管家”,也是 Rust 生态这么方便的核心原因。它把编译、依赖管理、项目打包、测试、发布这些原本需要好几个工具配合做的事,全部整合在了一条条简单的命令里,你不用再纠结“该用哪个版本的编译器”“依赖装在哪里”“怎么打包分发给用户”这种烦心事。
1.2.2 Cargo 的核心用法:从创建项目到发布二进制文件
> *Core Cargo usage: From project creation to binary release*
Cargo 随 Rust 工具链一起安装,你不需要额外下载任何东西。它最常用的 4 个命令,足够覆盖 90% 的日常开发场景:
1. 创建新项目:`cargo new`
> *Create a new project*
如果你要新建一个 Rust 项目,只需要在终端运行: ```bash
创建名为 my_project 的新项目,--bin 参数表示生成可执行文件项目
cargo new my_project --bin ``` Cargo 会自动生成一个标准结构的文件夹,里面包含 3 个核心文件:
- `Cargo.toml`:项目的“身份证”和“购物清单”,里面写明了项目名称、版本、依赖的库等信息;
- `src/main.rs`:项目的代码入口文件,相当于 Python 的 `main.py`、C++ 的 `main.cpp`;
- `.gitignore`:自动生成的 Git 忽略配置,不用你手动写。
> 💡 电子版侧边栏:Cargo.toml 是什么? > `Cargo.toml` 是 TOML 格式的配置文件,比 JSON、YAML 更适合写项目配置:注释方便、结构清晰、支持嵌套。比如你要加一个处理时间的第三方库 `chrono`,只需要在 `[dependencies]` 下面加一行 `chrono = "0.4"`,下次运行 `cargo build` 的时候 Cargo 会自动从 crates.io(Rust 的官方包仓库,相当于 Python 的 PyPI、JavaScript 的 npm)下载对应的库,不用你手动 `pip install` 或者解压配置,连虚拟环境都不用搭——Rust 的每个项目的依赖都是自动隔离的,不会出现“这个项目要依赖 1.0 版本的库,另一个项目要依赖 2.0 版本”的冲突问题。
2. 运行项目:`cargo run`
> *Run the project*
写完代码想直接运行?一条命令搞定: ```bash
自动编译+运行项目,编译后的文件会放在 target/debug 文件夹下
cargo run ``` `cargo run` 会先检查代码有没有错误,如果有错误会直接打印编译错误信息,没有错误就自动编译并运行。它默认用 debug 模式编译,编译速度快,但运行速度慢,适合开发阶段调试用。
3. 编译项目:`cargo build`
> *Build the project*
如果你要生成可执行文件,或者要发布项目,就用 `cargo build`: ```bash
debug 模式编译,编译快,运行慢,适合开发
cargo build
release 模式编译,开启全量优化,编译慢,运行快,适合发布
cargo build --release ``` release 模式编译出来的可执行文件,运行速度通常比 debug 模式快 5~10 倍,而且体积更小。比如之前写的批量重命名工具,debug 模式处理 1000 个文件需要 2 秒,release 模式只要 0.2 秒,性能差距非常明显。release 模式编译后的文件会放在 `target/release` 文件夹下,你可以直接把这个文件复制到其他电脑上运行,不需要装任何 Rust 环境,也不需要装任何依赖,这就是 Rust 说的“零成本抽象”和“原生性能”的直观体现。
4. 检查错误:`cargo check`
> *Check for errors*
开发阶段你不需要每次都完整编译,只要用 `cargo check` 就能快速检查代码有没有类型错误、所有权错误等编译问题,速度比 `cargo build` 快 5~10 倍,非常适合频繁修改代码的时候用。
> 💡 电子版侧边栏:Rust 编译慢怎么办? > 很多新手会吐槽 Rust 编译速度慢,毕竟编译器要做大量的静态检查(所有权、生命周期、类型检查等)。但实际上有非常多成熟的优化方案: > 1. 用 `sccache` 缓存编译结果,重复编译相同代码的速度能提升 10 倍以上; > 2. 用 `cargo check` 代替 `cargo build` 检查错误,开发阶段能节省大量时间; > 3. 用 `lld` 链接器代替系统默认的链接器,链接速度能提升 2~3 倍; > 4. 大型项目可以用 `cargo nextest` 并行跑测试,速度比默认的 `cargo test` 快 2 倍以上。 > 对于日常开发的小项目,编译速度其实和 C++ 差不多,完全在可接受范围内。
---
1.3 中英双语阅读指南:怎么读这本书最高效?
> *Bilingual reading guide: How to read this book most efficiently*
本书特意设计成中英双语的排版,不是为了“凑字数”,而是因为 Rust 的核心术语和概念,英文原版的表述往往比翻译更准确、更形象,避免翻译带来的歧义。比如“所有权(ownership)”这个核心概念,翻译成“所有权”容易让人误解成“法律上的所有权”,而英文 `ownership` 的本意是“拥有权、归属权”,更符合 Rust 里“每个值有且只有一个归属者”的语义;“借用(borrowing)”翻译成“借用”也很贴切,就像你借别人的东西用,用完要还,不能损坏,和 Rust 里的借用规则完全对应。
1.3.1 本书的排版规则
> *Typesetting rules of this book*
为了兼顾不同读者的需求,本书的排版遵循以下规则: 1. 中文为主,英文为辅:正文默认是中文,核心术语首次出现时会同时标注英文,例如:`所有权(ownership)`;关键概念会有中英双语对照的注释框; 2. 代码注释双语化:所有代码示例的注释都是中英双语,方便不同语言基础的读者理解; 3. 关键句双语对照:每章的核心观点会同时给出中英文表述,方便读者对照理解; 4. 术语表中英对照:每章末尾会附上本章的关键术语表,中英双语标注,方便复习和查询官方文档。
1.3.2 分阶段阅读建议
> *Reading suggestions by stage*
你可以根据自己的基础选择适合的阅读方式:
- **新手阶段(前3章)**:先以中文为主,理解核心概念,遇到不懂的术语可以看括号里的英文标注,暂时不用纠结英文原文的表述;
- **进阶阶段(4~10章)**:可以尝试看英文表述,理解原意,遇到翻译和英文原文有差异的地方,可以对照 Rust 官方文档的英文原文,避免理解偏差;
- **专业阶段(11~15章)**:可以直接参考 Rust 官方文档的英文原文,本书的双语表述可以帮助你更快理解官方文档的专业术语。
> 💡 新手小练习:试着写出下面 4 个核心术语的英文,看看你能不能对应上: > 1. 所有权 > 2. 借用 > 3. 生命周期 > 4. 特征(trait) > 答案放在本章末尾的术语表里,做完再看哦。
---
1.4 Rust 和其他语言对比:没有最好的语言,只有最合适的场景
> *Rust vs other languages: There is no best language, only the most suitable scenario*
很多人问:“Rust 是不是比 Python/C++