引言
注意:本书的这一版与 No Starch Press 出版的纸质版和电子版 The Rust Programming Language 内容一致。
欢迎阅读《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 团队希望让更多人——尤其是编程新手——能够接触到系统概念。
企业
数百家大大小小的企业在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网应用、机器学习,甚至 Firefox 浏览器的核心部分。
开源开发者
Rust 欢迎那些希望参与构建 Rust 编程语言、社区、开发工具和库的人。我们非常期待你为 Rust 语言做出贡献。
重视速度与稳定性的人
Rust 适合追求语言速度和稳定性的人。这里的速度,既指 Rust 代码的运行速度,也指 Rust 让你编写程序的效率。Rust 编译器的检查机制通过功能添加和重构来确保稳定性。这与那些缺乏此类检查的语言中脆弱的遗留代码形成了鲜明对比——开发者往往不敢修改那些代码。通过追求零成本抽象(zero-cost abstractions)——将高层特性编译为与手写代码一样快的底层代码——Rust 致力于让安全的代码同时也是高效的代码。
Rust 语言也希望能支持更多其他类型的用户,这里提到的只是其中一些最重要的群体。总的来说,Rust 最大的愿景是消除程序员数十年来不得不接受的那些取舍,同时提供安全与生产力、速度与易用性。试试 Rust,看看它的设计选择是否适合你。
本书适合谁
本书假设你已经用其他编程语言写过代码,但不限定是哪一种语言。我们尽力让内容对来自各种编程背景的读者都易于理解。我们不会花大量篇幅讨论编程是什么或如何思考编程。如果你完全没有编程经验,建议先阅读一本专门的编程入门书籍。
如何使用本书
总体而言,本书假设你按照从前到后的顺序阅读。后面的章节建立在前面章节的概念之上,前面的章节可能不会深入某个主题的细节,但会在后续章节中重新讨论。
本书包含两类章节:概念章节和项目章节。在概念章节中,你将学习 Rust 的某个方面。在项目章节中,我们将一起构建小程序,应用你已经学到的知识。第 2 章、第 12 章和第 21 章是项目章节,其余都是概念章节。
第 1 章介绍如何安装 Rust、如何编写一个“Hello, world!“程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第 2 章是 Rust 编程的实战入门,你将构建一个猜数字游戏。我们会在较高层面介绍一些概念,后续章节会提供更多细节。如果你想立刻动手实践,第 2 章正是为此而设。如果你是一个特别严谨的学习者,喜欢在继续之前掌握每个细节,那么你可以跳过第 2 章,直接进入第 3 章——它涵盖了与其他编程语言类似的 Rust 特性;之后你可以回到第 2 章,用学到的知识来完成项目。
在第 4 章中,你将学习 Rust 的所有权(ownership)系统。第 5 章讨论结构体和方法。第 6 章涵盖枚举、match 表达式,以及 if let 和 let...else 控制流结构。你将使用结构体和枚举来创建自定义类型。
在第 7 章中,你将学习 Rust 的模块系统以及用于组织代码和公共应用程序编程接口(API)的私有性规则。第 8 章讨论标准库提供的一些常用集合数据结构:vector、字符串和哈希 map。第 9 章探讨 Rust 的错误处理理念和技术。
第 10 章深入泛型(generics)、trait 和生命周期(lifetimes),它们赋予你定义适用于多种类型的代码的能力。第 11 章全面介绍测试,即使有 Rust 的安全保障,测试仍然是确保程序逻辑正确的必要手段。在第 12 章中,我们将自己实现 grep 命令行工具的部分功能——在文件中搜索文本。为此,我们将运用前面章节讨论过的许多概念。
第 13 章探讨闭包(closures)和迭代器(iterators):这些是 Rust 中来自函数式编程语言的特性。在第 14 章中,我们将更深入地了解 Cargo,并讨论与他人共享库的最佳实践。第 15 章讨论标准库提供的智能指针(smart pointers)以及实现其功能的 trait。
在第 16 章中,我们将介绍不同的并发编程模型,并讨论 Rust 如何帮助你无畏地进行多线程编程。在第 17 章中,我们在此基础上探索 Rust 的 async 和 await 语法,以及任务、future 和流(streams),还有它们所支持的轻量级并发模型。
第 18 章探讨 Rust 的惯用写法与你可能熟悉的面向对象编程原则之间的对比。第 19 章是关于模式和模式匹配的参考,它们是在 Rust 程序中表达思想的强大方式。第 20 章包含一系列高级主题,涵盖不安全 Rust(unsafe Rust)、宏(macros),以及更多关于生命周期、trait、类型、函数和闭包的内容。
在第 21 章中,我们将完成一个项目——实现一个底层的多线程 Web 服务器!
最后,一些附录以类似参考手册的格式包含了关于该语言的实用信息。附录 A 涵盖 Rust 的关键字,附录 B 涵盖 Rust 的运算符和符号,附录 C 涵盖标准库提供的可派生 trait,附录 D 涵盖一些实用的开发工具,附录 E 解释 Rust 的版本(editions)。在附录 F 中,你可以找到本书的翻译版本,在附录 G 中我们将介绍 Rust 是如何开发的以及什么是 nightly Rust。
阅读本书没有固定的方式:如果你想跳着读,尽管去做!如果遇到困惑,你可能需要跳回前面的章节。但怎样适合你就怎样来。
学习 Rust 过程中很重要的一点是学会阅读编译器显示的错误信息:它们会引导你写出正确的代码。因此,我们会提供许多无法编译的示例,以及编译器在各种情况下会显示的错误信息。请注意,如果你随意输入并运行某个示例,它可能无法编译!请务必阅读周围的文字,看看你尝试运行的示例是否本来就会报错。在大多数情况下,我们会引导你找到无法编译的代码的正确版本。Ferris 也会帮助你区分那些本来就不能正常工作的代码:
| Ferris | 含义 |
|---|---|
| 这段代码无法编译! | |
| 这段代码会 panic! | |
| 这段代码不会产生预期的行为。 |
在大多数情况下,我们会引导你找到无法编译的代码的正确版本。
源代码
生成本书的源文件可以在 GitHub 上找到。