原著：[The Rust Programming Language](https://doc.rust-lang.org/book/)

*原作者：Steve Klabnik 与 Carol Nichols, 及 Rust 社区*


此版本的教材，假定安装了 Rust `1.67.1` （发布于 2023-02-09）或更新版本。请参阅 [第 1 章的 “安装” 小节](Ch01_Getting_Started.md#安装) 进行安装，或对已安装的 Rust 进行升级。

```console
$ rustc --version
rustc 1.68.0 (2c8cc3432 2023-03-06)
```


在线阅读: [rust-lang.xfoss.com](https://rust-lang.xfoss.com)

本地阅读：[`mdbook` 本地运行](./local_serving.md)

---

# 前言和简介

这并不总是那么清楚，但 Rust 编程语言从根本上讲是关于 *赋能，empowerment*：无论你现在写的是哪种代码，Rust 都能使你达到更远的地方，在比以前更广泛的领域自信地编程。

以涉及内存管理、数据表示和并发的低层次细节的 “系统级，system-level” 工作为例，传统上，这一领域的编程被认为是神秘的，只有少数致力于学习避免其臭名昭著的陷阱的人可以进入。即使是那些实践他的人也会谨慎行事，以免他们的代码容易招致攻击、崩溃或损坏。

通过消除原有各种陷阱，并提供友好、全新工具集一路帮助咱们，Rust 破除了编写这类苛刻程序中的诸多障碍。那些需要“深入”到底层控制的程序员们，现在就可以运用 Rust，在无需承担一直以来的崩溃或者安全漏洞的下，并无须深入细致地掌握变化无常工具链，就可以达成他们的目标了。更好的是，设计这门语言就是为了引导咱们编写出在运行速度及内存使用方面有效率的可靠代码。

已在进行底层代码编写的程序员们，可运用 Rust 来托起他们的雄心壮志。比如说，在 Rust 中引入并行机制，是相对低风险的手法：编译器会为咱们捕获经典错误。同时咱们还可以在不会引入程序崩溃或漏洞利用下，自信地进行更激进的优化。

而 Rust 并不局限于底层的系统变成。对于构造命令行应用、web 服务器及其他类别的代码来说，它的表现力和人体工程学足以使命令行界面的，Command-Line Interface，CLI，应用程序、Web 服务器和许多其他类型的代码编写得相当愉快 -- 你会在本书后面找到这两种代码的简单例子。使用 Rust 可以让咱们构建出从一个领域迁移到另一领域的技能；咱们可以通过编写 Web 应用来学习 Rust，然后把这些相同的技能应用在咱们的 Raspberry Pi 上。

本书充分体现了 Rust 在增强用户能力方面的潜力。这是一本友好且平易近人的教材，旨在帮助咱们不仅提高咱们的 Rust 知识水平，并提高咱们作为一名普通程序员的触及范围和信心。那么，请投入其中，准备学习，并欢迎加入 Rust 社区！

-- *Nicholas Matsakis 与 Aaron Turon*


## 简介

欢迎来到《Rust编程语言，The Rust Programming Language》，这是一本关于Rust的介绍性书籍。Rust 编程语言帮助咱们编写更快、更可靠的软件。程序语言设计中，高级别的人机交互与底层控制，通常是不可调和的；Rust 挑战了这一冲突。通过强大的技术能力与了不起的开发者体验，Rust 让咱们可以选择控制底层细节（如内存使用），却没有传统上底层控制相关的所有麻烦。

## Rust 适用于哪些人群

出于各种原因，Rust 是许多人的理想选择。让我们来看看一些最重要的群体。

### 开发者团队

事实证明，Rust 是一个富有成效的工具，可以在具有不同水平的系统编程知识的开发人员组成的大型团队之间进行协作。底层代码容易出现各种细微的错误，在大多数其他语言中，只有通过广泛的测试和有经验的开发人员的仔细代码审查才能发现这些错误。在 Rust 中，编译器扮演着守门员的角色，他会拒绝编译带有这些难以捉摸错误的代码，包括并发性错误。通过与编译器一起工作，团队可以把时间集中在程序的逻辑上，而不是追寻 bug。

Rust还为系统编程领域带来了当代开发者工具：

- Cargo，Rust 所包含的依赖管理器与构建工具，使添加、编译和管理依赖变得简单，并在整个Rust生态系统中保持一致，Cargo, the included dependency manager and build tool, makes adding, compiling, and managing dependecies painless and consistant across the Rust ecosystem；
- Rustfmt格式化工具确保了不同的开发人员有一致的编码风格。
- Rust 语言服务器支持集成开发环境(IDE)集成，以实现代码补全和内联错误信息。

通过使用这些工具和Rust生态系统中的其他工具，开发人员可以在编写系统级代码时提高工作效率。


### 学生

Rust 是为学生和那些对学习系统概念感兴趣的人准备的。使用 Rust，许多人已经了解了操作系统开发等主题。这个社区非常热情，乐于回答学生的问题。通过像本书这样的努力，Rust 团队希望让更多的人了解系统概念，尤其是那些刚接触编程的人。


### 商业公司

数百家大大小小的公司在生产中使用 Rust 来完成各种任务，包括命令行工具、web 服务、DevOps 运维工具、嵌入式设备、音视频分析和转码、加密货币、生物信息学、搜索引擎、物联网 IoT 应用、机器学习，甚至是火狐 web 浏览器的主要部分。


### 开放源代码开发者


Rust 是为那些想建立 Rust 编程语言、社区、开发者工具和库的人准备的。我们很希望你能为 Rust 语言做出贡献。


### 看重运行速度与稳定性的人们

Rust 是为那些渴望语言的速度和稳定性的人准备的。我们所说的速度，既指 Rust 代码的运行速度，也指 Rust 让咱们编写程序的速度。Rust 编译器的检查，通过特性补充与重构来确保稳定性。这与没有这些检查的语言中脆弱的遗留代码形成了鲜明的对比，因为开发人员往往害怕修改这些代码。通过努力实现零成本的抽象，更高层次的功能，编译成底层代码，其速度与手工编写的代码一样快，Rust 努力使安全的代码也成为快速的代码。

Rust 语言希望也能支持许多其他用户；这里提到的只是一些最大的利益相关者。总的来说，Rust 最大的野心是通过提供安全 *和* 生产力、速度 *和* 人机交互，来消除程序员几十年来所接受的这些方面的权衡取舍。给 Rust 一个尝试，看看他的选择是否适合你。

## 本书读者群体

本书假设你用另一种编程语言写过代码，但不对哪种语言做任何假设。我们试图让来自不同编程背景的人，都能广泛接触到这些材料。我们没有花很多时间来讨论什么是编程或如何思考他。如果你对编程完全陌生，你最好读一本专门介绍编程的书。


## 怎样使用本书

大体上，本书假定是要按从前往后的顺序进行阅读。后续章节是建立在较早章节的概念之上，前面的章节可能不会深入研究某个话题；在后续章节通常会回顾到那个话题。

在本书中，咱们会发现有两种章节：概念章节和项目章节。在概念章节中，咱们将学习 Rust 的某个方面。在项目章节中，咱们将一起构建小程序，应用咱们到目前为止所学到的知识。第 2 章、第 12 章和第 20 章是项目章节；其余的是概念章节。

第 1 章介绍了如何安装 Rust，如何编写 "Hello, world!" 程序，以及如何使用 Rust 的包管理器和构建工具 Cargo。第 2 章是用 Rust 编写程序的实践介绍，让咱们构建出一个数字猜谜游戏。这里咱们从高层次上介绍了一些概念，后面的章节将提供更多的细节。如果咱们想马上动手，第 2 章就是这样的地方。第 3 章介绍了与其他编程语言类似的 Rust 特性，在第 4 章中咱们将了解 Rust 的所有权系统。如果你是一个特别细致的学习者，喜欢在学习每一个细节后再继续学习，你可能想跳过第 2 章，直接学习第 3 章，当你想在一个项目中应用你学到的细节时，再回到第 2 章。

第 5 章讨论了结构和方法，第 6 章包括枚举、`match` 表达式和 `if let` 控制流结构。咱们将使用结构体和枚举来构造 Rust 中的自定义类型。

在第 7 章中，咱们将了解 Rust 的模组系统，以及组织代码的隐私规则及其公共应用编程接口，Application Programming Interface, API。第 8 章讨论了标准库提供的一些常见的集合数据结构，如向量、字符串和哈希图。第 9 章探讨了 Rust 的错误处理的概念和技巧。

第 10 章深入探讨了泛型、特性和生命期，他们让咱们有能力定义出适用于多种类型的代码。第 11 章是关于测试的，即便有 Rust 的安全保证，为确保咱们程序逻辑正确，测试仍是必要不可缺少的。在第 12 章中，我们将对 `grep` 命令行工具中的一个子集的功能建立自己的实现，他可以在文件中搜索文本。为此，我们将使用我们在前几章中讨论的许多概念。

第 13 章探讨了闭包和迭代器：来自于函数式编程语言的 Rust 特性。在第 14 章中，我们将更深入地研究 Cargo，并讲到与他人共享库的最佳实践。第 15 章讨论了标准库提供的智能指针和实现其功能的特质。

第 16 章，咱们将过目不同的并发编程模型，并探讨 Rust 如何帮助咱们大胆地以多线程方式编程。第 17 章着眼于 Rust 习语如何与您可能熟悉的面向对象编程原则进行比较。

第 18 章是关于模式和模式匹配的参考，他们是在整个 Rust 程序中表达思想的强大方式。第 19 章包含大量有趣的高级主题，包括不安全的 Rust、宏，以及更多关于生命周期、特征、类型、函数和闭包的内容。

第 20 章，咱们将完成其中实现了底层线程化的 web 服务器！

最后，一些附录以更类似于参考的格式包含有关该语言的有用信息。附录 A 涵盖了 Rust 的关键字，附录 B 涵盖了 Rust 的运算符和符号，附录 C 涵盖了标准库提供的可派生特质，附录 D 涵盖了一些有用的开发工具，附录 E 解释了 Rust 版本。在附录 F 中，你可以找到这本书的翻译，在附录 G 中，我们将介绍 Rust 是如何构造的以及什么是每日 Rust, nightly Rust。

阅读本书并无定法：你要跳着去读，也是可以的！在遇到疑惑时，或许就不得不跳回去看看了。你只要怎么有效就行了。

学习 Rust 过程中的一个重要部分是学习如何阅读编译器给出的错误信息：这些信息将指导咱们编写工作的代码。因此，我们将提供许多不能编译的例子，以及编译器在每种情况下显示的错误信息。要知道，如果咱们随便输入并运行一个例子，他可能不会被编译！请确保咱们阅读报错周围的文字，看看咱们试图运行的例子是否会出错。

在大多数情况下，我们会带着找到任何不能编译的代码的正确版本。

## 本书的源码

本书所产生的源码，可在 [Github: gnu4cn/rust-lang](https://github.com/gnu4cn/rust-lang-zh_CN/releases/tag/v0.2.0) 下载到。
