# 简介

> 注意：本书的版本（英文版）与出版的 The Rust Programming Language 和电子版的 No Starch Press 一致。

欢迎阅读《Rust 程序设计语言》，这是一本介绍 Rust 的图书。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中，高层工程学和底层控制往往不能兼得；Rust 则试图挑战这一矛盾。通过权衡强大的技术能力与优秀的开发体验，Rust 允许你控制底层细节（比如内存使用），并免受以往进行此类控制所经受的所有烦恼。

## 谁会使用 Rust

Rust 因多种原因适用于很多开发者。让我们看下几个最重要的群体。

### 开发者团队

Rust 被证明是可用于大型的、拥有不同层次系统编程知识的开发者团队间协作的高效工具。底层代码中容易出现种种隐晦的 bug，在其他编程语言中，只能通过大量的测试和经验丰富的开发者细心的代码评审来捕获它们。在 Rust 中，编译器充当了守门员的角色，它拒绝编译存在这些难以捕获的 bug 的代码，这其中包括并发 bug。通过与编译器合作，团队将更多的时间聚焦在程序逻辑上，而不是追踪 bug。

Rust 也为系统编程世界带来了现代化的开发工具：

- Cargo，内置的依赖管理器和构建工具，它能轻松增加、编译和管理依赖，并使其在 Rust 生态系统中保持一致。
- Rustfmt 确保开发者遵循一致的代码风格。
- Rust Language Server 为集成开发环境（IDE）提供了强大的代码补全和内联错误信息功能。

通过使用 Rust 生态系统中的这些和其他工具，开发者可以在编写系统层面代码时保持高生产力。

### 学生

Rust 适用于学生和对学习系统概念感兴趣的其他人。通过 Rust，很多人已经了解了操作系统开发等主题。社区非常欢迎并乐于解答学生们的问题。通过本书的努力，Rust 团队希望系统概念能被更多人了解，特别是编程新手。

### 公司

数以百计的公司，无论规模大小，都在生产中使用 Rust 来完成各种任务。这些任务包括命令行工具、web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币（cryptocurrencies）、生物信息学（bioinformatics）、搜索引擎、物联网（internet of things, IOT）程序、机器学习，甚至还包括 Firefox 浏览器的大部分内容。

### 开源开发者

Rust 适用于希望构建 Rust 编程语言、社区、开发工具和库的开发者。我们很乐意您为 Rust 语言做贡献。

### 重视速度和稳定性的开发者

Rust 适用于追求编程语言的速度与稳定性的开发者。所谓速度，是指你用 Rust 开发出的程序运行速度，以及 Rust 提供的程序开发速度。Rust 的编译器检查确保了增加功能和重构代码时的稳定性。这与缺少这些检查的语言形成鲜明对比，开发者通常害怕修改那些脆弱的遗留代码。力求零开销抽象（zero-cost abstractions），把高级的特性编译成底层的代码，这样写起来很快，运行起来也很快，Rust 致力于使安全的代码也同样快速。

Rust 语言也希望能支持很多其他用户，这里提及的只是最大的利益相关者。总的来讲，Rust 最重要的目标是消除数十年来开发者不得不做的权衡：安全与生产力，速度与人机交互的顺畅度（ergonomics）。请尝试 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 章讨论了一些标准库提供的常见集合数据结构，比如可变长数组（vector）、字符串和哈希 map。第 9 章探索了 Rust 的错误处理哲学和技术。

第 10 章深入介绍泛型、trait 和生命周期，他们提供了定义出适用于多种类型的代码的能力。第 11 章全部关于测试，即使 Rust 有安全保证，也需要测试确保程序逻辑正确。第 12 章，我们构建了属于自己的在文件中搜索文本的命令行工具 `grep` 的子集功能实现。为此会利用之前章节讨论的很多概念。

第 13 章探索了闭包和迭代器：Rust 中来自函数式编程语言的功能。第 14 章会更深层次的理解 Cargo 并讨论向他人分享库的最佳实践。第 15 章讨论标准库提供的智能指针以及启用这些功能的 trait。

第 16 章会学习不同的并发编程模型，并讨论 Rust 如何助你无畏的编写多线程程序。第 17 章着眼于比较 Rust 风格与你可能熟悉的面向对象编程原则。

第 18 章是关于模式和模式匹配的参考章节，它是在 Rust 程序中表达思想的有效方式。第 19 章是一个高级主题大杂烩，包括 unsafe Rust、宏和更多关于生命周期、 trait、类型、函数和闭包的内容。

第 20 章将会完成一个项目，我们会实现一个底层的、多线程的 web server！

最后是一些附录，包含了一些关于语言的参考风格格式的实用信息。附录 A 介绍了 Rust 的关键字。附录 B 介绍 Rust 的运算符和符号。附录 C 介绍标准库提供的派生 trait。附录 D 涉及了一些有用的开发工具，附录 E 介绍了 Rust 的不同版本。

怎样阅读本书都不会有任何问题：如果你希望略过一些内容，请继续！如果你发现疑惑可能会再跳回之前的章节。请随意阅读。

学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息：它们会指导你编写出能工作的代码。为此，我们会提供很多不能编译的示例，以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码，它们可能无法编译！请确保阅读任何你尝试运行的示例周围的文本内容，检查它们是否有意写错。Ferris 也会帮助你区别那些有意无法工作的代码：

Ferris | 意义
--- | ---
| 这些代码不能编译！
| 这些代码会 panic！
| 这些代码没有产生期望的行为。

在大部分情况，我们会指引你将任何不能编译的代码纠正为正确版本。

## 源代码

生成本书的源码可以在 GitHub （英文原书的 GitHub） 上找到。