简介

注:本书版本与 No Starch Press 出版的印刷版和电子书版《The Rust Programming Language》nsprust 相同。

欢迎阅读《The Rust Programming Language》,这是一本关于 Rust 的入门书籍。Rust 编程语言帮助你编写更快、更可靠的软件。在编程语言设计中,高层次的易用性和低层次的控制往往难以两全;Rust 挑战了这一矛盾。通过平衡强大的技术能力和出色的开发者体验,Rust 让你可以选择控制底层细节(如内存使用),而无需承担传统上与这种控制相关的麻烦。

Rust 适合谁

Rust 因多种原因对许多人来说都是理想的选择。让我们来看几个最重要的群体。

开发团队

Rust 已被证明是一种高效的工具,适用于具有不同系统编程知识水平的大型开发团队协作。底层代码容易出现各种微妙的错误,而在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细代码审查来发现。在 Rust 中,编译器充当守门员的角色,拒绝编译包含这些难以捉摸的错误(包括并发错误)的代码。通过与编译器一起工作,团队可以专注于程序逻辑,而不是追逐错误。

Rust 还为系统编程世界带来了现代开发者工具:

  • Cargo,内置的依赖管理器和构建工具,使得在 Rust 生态系统中添加、编译和管理依赖变得轻松且一致。
  • Rustfmt 格式化工具确保开发者之间的一致编码风格。
  • rust-analyzer 为集成开发环境(IDE)提供代码补全和内联错误消息支持。

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

学生

Rust 适合学生和那些对系统概念感兴趣的人。使用 Rust,许多人已经学习了操作系统开发等主题。社区非常欢迎学生,并乐于回答他们的问题。通过这本书等努力,Rust 团队希望让系统概念对更多人更加容易接触,特别是那些编程新手。

公司

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

开源开发者

Rust 适合那些想要构建 Rust 编程语言、社区、开发者工具和库的人。我们非常欢迎你为 Rust 语言做贡献。

追求速度和稳定性的人

Rust 适合那些对语言的速度和稳定性有要求的人。这里所说的速度,既指 Rust 代码的运行速度,也指 Rust 让你编写程序的速度。Rust 编译器的检查通过功能添加和重构确保了稳定性。这与没有这些检查的语言中的脆弱遗留代码形成对比,开发者常常害怕修改这些代码。通过追求零成本抽象——编译成底层代码的高层特性,速度与手动编写的代码一样快——Rust 致力于使安全代码也是快速代码。

Rust 语言希望支持更多其他用户;这里提到的只是其中一些最大的利益相关者。总体而言,Rust 最大的抱负是通过提供安全性和生产力、速度和易用性,消除程序员几十年来所接受的权衡。尝试一下 Rust,看看它的选择是否适合你。

这本书适合谁

本书假设你已经用另一种编程语言编写过代码,但对具体是哪种语言不做任何假设。我们尽量让材料广泛适用于具有各种编程背景的人。我们不会花太多时间讨论编程是什么或如何思考编程。如果你完全是编程新手,阅读一本专门介绍编程的书籍会更有帮助。

如何使用这本书

一般来说,本书假设你是按顺序从前到后阅读的。后面的章节建立在前面章节的概念之上,前面的章节可能不会深入探讨某个特定主题,但会在后面的章节中重新讨论该主题。

本书中有两种类型的章节:概念章节和项目章节。在概念章节中,你将学习 Rust 的某个方面。在项目章节中,我们将一起构建小型程序,应用你迄今为止所学的知识。第 2、12 和 21 章是项目章节;其余的是概念章节。

第 1 章解释如何安装 Rust,如何编写“Hello, world!”程序,以及如何使用 Cargo,Rust 的包管理器和构建工具。第 2 章是对在 Rust 中编写程序的实践介绍,让你构建一个猜数游戏。这里我们高层次地介绍概念,后面的章节将提供更多细节。如果你想立即动手实践,第 2 章就是你的起点。第 3 章涵盖与其他编程语言类似的 Rust 特性,第 4 章你将学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在继续下一个主题之前学习每一个细节,你可能会想跳过第 2 章,直接去第 3 章,当你想通过应用所学知识的项目时再返回第 2 章。

第 5 章讨论结构体和方法,第 6 章涵盖枚举、match 表达式和 if let 控制流构造。你将使用结构体和枚举在 Rust 中创建自定义类型。

在第 7 章,你将学习 Rust 的模块系统和组织代码及其公共应用程序编程接口(API)的隐私规则。第 8 章讨论标准库提供的一些常见集合数据结构,如向量、字符串和哈希映射。第 9 章探讨 Rust 的错误处理哲学和技术。

第 10 章深入研究泛型、特性和生命周期,这些特性让你能够定义适用于多种类型的代码。第 11 章全部关于测试,即使有 Rust 的安全保证,测试也是确保程序逻辑正确的必要手段。在第 12 章,我们将构建 grep 命令行工具的一个子集功能实现,用于在文件中搜索文本。为此,我们将使用前面章节讨论的许多概念。

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

在第 16 章,我们将探讨不同的并发编程模型,并讨论 Rust 如何帮助你在多线程中无畏地编程。在第 17 章,我们在此基础上进一步探讨 Rust 的 async 和 await 语法,以及任务、未来和流,以及它们启用的轻量级并发模型。

第 18 章比较 Rust 惯用法与你可能熟悉的面向对象编程原则。第 19 章是关于模式和模式匹配的参考,这些是 Rust 程序中表达思想的强大方式。第 20 章包含一系列高级主题,包括不安全的 Rust、宏以及更多关于生命周期、特性、类型、函数和闭包的内容。

在第 21 章,我们将完成一个项目,在该项目中我们将实现一个低级别的多线程 Web 服务器!

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

阅读这本书没有错误的方式:如果你想跳过前面的内容,尽管去做!如果你遇到任何困惑,可能需要跳回到前面的章节。但无论如何,选择适合你的方式。

学习 Rust 过程中的一个重要部分是学习如何阅读编译器显示的错误消息:这些将引导你编写可运行的代码。因此,我们将提供许多无法编译的示例,并附上编译器在每种情况下显示的错误消息。请注意,如果你输入并运行一个随机示例,它可能无法编译!确保阅读周围的文本,看看你尝试运行的示例是否预期会出错。Ferris 也会帮助你区分不应该工作的代码:

Ferris含义
Ferris with a question mark此代码无法编译!
Ferris throwing up their hands此代码发生恐慌!
Ferris with one claw up, shrugging此代码未产生预期的行为。

在大多数情况下,我们会引导你找到任何无法编译的代码的正确版本。

源代码

生成本书的源文件可以在 GitHub 上找到。