|
|
|
|
@ -1,14 +1,13 @@
|
|
|
|
|
# 简介
|
|
|
|
|
|
|
|
|
|
<!-- https://github.com/rust-lang/book/blob/main/src/ch00-00-introduction.md -->
|
|
|
|
|
<!-- commit 56ec353290429e6547109e88afea4de027b0f1a9 -->
|
|
|
|
|
[ch00-00-introduction.md](https://github.com/rust-lang/book/blob/112ceaedfa51d79327e33057c9806d0ea370004a/src/ch00-00-introduction.md)
|
|
|
|
|
|
|
|
|
|
> 注意:此书的英文原版与 [No Starch Press][nsp] 出版的《[The Rust Programming Language][nsprust]》纸质版和电子版一致。
|
|
|
|
|
|
|
|
|
|
[nsprust]: https://nostarch.com/rust-programming-language-2nd-edition
|
|
|
|
|
[nsprust]: https://nostarch.com/rust-programming-language-3rd-edition
|
|
|
|
|
[nsp]: https://nostarch.com/
|
|
|
|
|
|
|
|
|
|
欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层的工程学与底层的控制往往是难以兼得的;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受通常与此类控制相关的所有繁琐细节。
|
|
|
|
|
欢迎阅读《Rust 程序设计语言》,这是一本关于 Rust 的入门书籍。Rust 编程语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层工程学与底层控制往往彼此冲突;而 Rust 则试图挑战这一矛盾。通过平衡强大的技术能力与优秀的开发者体验,Rust 为你提供了控制底层细节(如内存使用)的选项,而无需承受传统上与此类控制相关的所有繁琐负担。
|
|
|
|
|
|
|
|
|
|
## Rust 适合哪些人
|
|
|
|
|
|
|
|
|
|
@ -16,23 +15,23 @@ Rust 因多种原因适合许多人。让我们看看几个最重要的群体。
|
|
|
|
|
|
|
|
|
|
### 开发者团队
|
|
|
|
|
|
|
|
|
|
Rust 已被证明是一个对于具有不同系统编程知识水平的大型开发团队协作而言,非常高效的工具。底层代码容易出现各种微妙的错误,在大多数其他语言中,这些错误只能通过广泛的测试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集中在程序逻辑上,而不是追踪 bug。
|
|
|
|
|
Rust 已被证明是一个适合拥有不同系统编程知识水平的大型开发团队协作的高效工具。底层代码容易出现各种微妙的错误,而在大多数其他语言中,这些错误往往只能通过大量测试以及经验丰富的开发者进行细致的代码审查来发现。在 Rust 中,编译器充当了守门人的角色,会拒绝编译包含这类隐蔽错误的代码,其中也包括并发错误。通过与编译器协作,团队可以将时间集中在程序逻辑上,而不是到处追查 bug。
|
|
|
|
|
|
|
|
|
|
Rust 也为系统编程世界带来了现代化的开发工具:
|
|
|
|
|
|
|
|
|
|
* Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
|
|
|
|
|
* Rustfmt 格式化工具确保开发者遵循一致的代码风格。
|
|
|
|
|
* rust-analyzer 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
|
|
|
|
|
- Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。
|
|
|
|
|
- Rustfmt 格式化工具确保开发者遵循一致的代码风格。
|
|
|
|
|
- Rust Language Server 为集成开发环境(IDE)提供代码补全和内联错误信息功能。
|
|
|
|
|
|
|
|
|
|
通过使用 Rust 生态系统中丰富的工具,开发者在编写系统级代码时可以更加高效。
|
|
|
|
|
|
|
|
|
|
### 学生
|
|
|
|
|
|
|
|
|
|
Rust 适合学生群体,也适合有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区对学生问题非常欢迎并乐于回答。通过类似这本书以及其他内容的努力,Rust 团队希望使系统概念能为更多人所易于理解,特别是编程新手。
|
|
|
|
|
Rust 适合学生,也适合那些有兴趣学习系统概念的人。许多人通过 Rust 学习了操作系统开发等主题。社区非常欢迎学生提问,也乐于回答。通过这本书以及其他类似内容的努力,Rust 团队希望让系统概念对更多人来说更容易理解,尤其是那些编程新手。
|
|
|
|
|
|
|
|
|
|
### 公司
|
|
|
|
|
|
|
|
|
|
数百家大小规模的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IOT)程序、机器学习,甚至是 Firefox 浏览器的重要部分。
|
|
|
|
|
数百家大大小小的公司在生产环境中使用 Rust 完成各种任务,包括命令行工具、Web 服务、DevOps 工具、嵌入式设备、音视频分析与转码、加密货币、生物信息学、搜索引擎、物联网(IoT)应用、机器学习,甚至是 Firefox 浏览器的重要组成部分。
|
|
|
|
|
|
|
|
|
|
### 开源开发者
|
|
|
|
|
|
|
|
|
|
@ -40,33 +39,33 @@ Rust 适合那些希望构建 Rust 编程语言、社区、开发工具和库的
|
|
|
|
|
|
|
|
|
|
### 重视速度和稳定性的开发者
|
|
|
|
|
|
|
|
|
|
Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。对于速度来说,既是指 Rust 可以运行的多快,也是指编写 Rust 程序的速度。Rust 编译器的检查确保了增加功能和重构代码时的稳定性,这与那些缺乏这些检查的语言中脆弱的祖传代码形成了鲜明对比,开发者往往不敢去修改这些代码。通过追求零成本抽象(zero-cost abstractions)—— 将高级语言特性编译成底层代码,并且与手写的代码运行速度同样快。Rust 努力确保代码又安全又快速。
|
|
|
|
|
Rust 适合那些看重速度与稳定性的人。这里所说的速度,既指 Rust 代码运行得有多快,也指 Rust 让你编写程序的速度有多快。Rust 编译器的各项检查,能够在添加新功能和重构时保障稳定性。这与那些缺少这些检查的语言中脆弱的遗留代码形成鲜明对比,因为开发者往往害怕修改那样的代码。通过追求零成本抽象(zero-cost abstractions)这种目标,也就是让高级特性编译成底层代码后依然和手写代码一样快,Rust 致力于让安全的代码也同样快速。
|
|
|
|
|
|
|
|
|
|
这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最重要的目标是消除数十年来程序员习以为常的取舍,让安全和高效、速度和易读易用**可以兼得**。试试看 Rust,说不定它的选择就适合你。
|
|
|
|
|
这里提到的只是几个较大的受益群体,Rust 语言也希望能支持更多其他用户。总的来说,Rust 最大的抱负是消除程序员数十年来一直接受的那些取舍,让安全与生产力、速度与易用性**可以兼得**。试试看 Rust,看看它的选择是否适合你。
|
|
|
|
|
|
|
|
|
|
## 本书适合哪些人
|
|
|
|
|
|
|
|
|
|
本书假设你已经有其他编程语言的经验,任何语言均可,我们力求让各种语言背景的人都能读懂。本书的重点不是程序设计**本身**,也不是程序设计思维。如果你完全没学过编程,建议你先阅读专门介绍程序设计的书籍。
|
|
|
|
|
本书假设你已经写过另一种编程语言的代码,但不限定具体是哪一种。我们努力让拥有各种编程背景的人都能读懂本书。本书不会花太多篇幅讨论程序设计**本身**是什么,也不会详细讲如何建立程序设计思维。如果你完全没有编程经验,那么先读一本专门介绍程序设计的入门书会更合适。
|
|
|
|
|
|
|
|
|
|
## 如何阅读本书
|
|
|
|
|
|
|
|
|
|
本书大体上假设你按从头到尾的顺序阅读。后面的章节建立在前面章节概念的基础上。前面的章节可能不会深入介绍部分主题,而是留待后续章节重新讨论。
|
|
|
|
|
|
|
|
|
|
本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小型程序。第二、十二和二十一章是项目章节;其余都是概念章节。
|
|
|
|
|
本书分为两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们会一起构建小程序,将目前学到的知识应用起来。第二、十二和二十一章是项目章节;其余都是概念章节。
|
|
|
|
|
|
|
|
|
|
第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是一个编写 Rust 语言的实战介绍,我们会构建一个猜数字游戏。我们会站在较高的层次介绍一些概念,而后续章节将提供更多细节。如果你希望立刻就动手实践一下,第二章是开始的好地方。第三章介绍 Rust 中类似其他编程语言的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想要跳过第二章,直接阅读第三章,等到你想要通过项目应用所学到的细节时再回到第二章。
|
|
|
|
|
第一章介绍如何安装 Rust,如何编写一个 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章则通过构建一个猜数字游戏,带你动手编写 Rust 程序。这里我们会在较高层次上介绍一些概念,而后续章节将提供更多细节。如果你想立刻动手实践,第二章就是最适合开始的地方。第三章介绍 Rust 中那些与其他编程语言相似的特性,第四章会学习 Rust 的所有权系统。如果你是一个特别细致的学习者,喜欢在进入下一环节之前学习每一个细节,你可能会想跳过第二章,直接阅读第三章;之后等你想通过项目运用学到的细节时,再回到第二章。
|
|
|
|
|
|
|
|
|
|
第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、`match` 表达式和 `if let` 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。
|
|
|
|
|
第五章讨论结构体(struct)和方法,第六章介绍枚举(enum)、`match` 表达式,以及 `if let` 和 `let...else` 控制流结构。在 Rust 中,创建自定义类型需要用到结构体和枚举。
|
|
|
|
|
|
|
|
|
|
第七章介绍 Rust 的模块(module)系统,其中的私有性规则用来组织代码和公开的 API(应用程序接口)。第八章讨论标准库提供的常见集合数据结构,例如 Vector(向量)、字符串和 Hash Map(散列表)。第九章探索 Rust 的错误处理的理念与技术。
|
|
|
|
|
第七章介绍 Rust 的模块(module)系统,以及用于组织代码及其公开 API(应用程序接口)的私有性规则。第八章讨论标准库提供的一些常见集合数据结构,例如 vector(动态数组)、字符串和 hash map(散列表、哈希表)。第九章探索 Rust 的错误处理理念与技术。
|
|
|
|
|
|
|
|
|
|
第十章深入介绍泛型(generic)、Trait 和生命周期(lifetime),这些功能让你能够定义适用于多种类型的代码。第十一章全面讲述了测试,因为就算 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章中将会构建我们自己的 `grep` 命令行工具的功能子集实现,用于在文件中搜索文本。为此会用到之前章节讨论的很多概念。
|
|
|
|
|
|
|
|
|
|
第十三章探索闭包(closure)和迭代器(iterator),这两个 Rust 特性来自函数式编程语言。第十四章会深入探讨 Cargo 并介绍分享代码库的最佳实践。第十五章讨论标准库提供的智能指针以及相关的 trait。
|
|
|
|
|
第十三章探索闭包(closure)和迭代器(iterator),它们是来自函数式编程语言的 Rust 特性。第十四章会更深入地探讨 Cargo,并介绍与他人共享库的最佳实践。第十五章讨论标准库提供的智能指针以及使其发挥作用的 trait。
|
|
|
|
|
|
|
|
|
|
第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及它们所支持的轻量级并发模型。
|
|
|
|
|
第十六章将引导我们了解不同的并发编程模型,并探讨 Rust 如何帮助你无畏地进行多线程编程。第十七章将在此基础上进一步探索 Rust 的 async 和 await 语法,以及任务、future 和 stream,还有它们所支持的轻量级并发模型。
|
|
|
|
|
|
|
|
|
|
第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。第十九章是一个模式和模式匹配的参考,它们是在 Rust 程序中表达思想的有效方式。第二十章是一个高级主题大杂烩,包括不安全 Rust(unsafe Rust)、宏(macro)和更多关于生命周期、Trait、类型、函数和闭包的内容。
|
|
|
|
|
第十八章着眼于 Rust 风格与你可能比较熟悉的 OOP(面向对象编程)原则之间的比较。第十九章是一个关于模式与模式匹配的参考,它们是在 Rust 程序中表达思想的有力方式。第二十章则汇集了一系列你可能感兴趣的高级主题,包括不安全 Rust(unsafe Rust)、宏(macro),以及更多关于生命周期、trait、类型、函数和闭包的内容。
|
|
|
|
|
|
|
|
|
|
第二十一章我们将会完成一个项目,实现一个底层多线程的 Web 服务端!
|
|
|
|
|
|
|
|
|
|
@ -76,12 +75,12 @@ Rust 适合那些渴望在编程语言中寻求速度与稳定性的开发者。
|
|
|
|
|
|
|
|
|
|
<span id="ferris"></span>
|
|
|
|
|
|
|
|
|
|
学习 Rust 的一个重要部分是学会如何阅读编译器显示的错误信息:它们会指引你编写出能运行的代码。为此,我们将提供许多不能编译的示例,以及在每种情况下编译器将显示的错误信息。请知悉,如果你输入并运行一个随机示例,它可能无法编译!确保你阅读了示例周围的文本,以判断你尝试运行的示例是否出错。Ferris 也将帮助你区分那些不是意在工作的代码:
|
|
|
|
|
学习 Rust 的一个重要部分,是学会如何阅读编译器显示的错误信息:它们会指引你写出能运行的代码。为此,我们将提供许多无法编译的示例,以及编译器在每种情况下会显示的错误信息。请注意,如果你随手输入并运行某个示例,它可能无法编译!请务必阅读示例周围的文字,确认你尝试运行的示例是否本来就预期会报错。Ferris 也会帮助你区分那些本就不是为了正常工作的代码:
|
|
|
|
|
|
|
|
|
|
| Ferris | 含义 |
|
|
|
|
|
|---------------------------------------------------------------------------------------------------------|--------------------------------|
|
|
|
|
|
| <img src="img/ferris/does_not_compile.svg" class="ferris-explain" alt="Ferris 头上有问号"/> | 这段代码无法通过编译! |
|
|
|
|
|
| <img src="img/ferris/panics.svg" class="ferris-explain" alt="Ferris 举起两只钳子"/> | 这段代码会 Panic! |
|
|
|
|
|
| <img src="img/ferris/panics.svg" class="ferris-explain" alt="Ferris 举起两只钳子"/> | 这段代码会 panic! |
|
|
|
|
|
| <img src="img/ferris/not_desired_behavior.svg" class="ferris-explain" alt="Ferris 举起一只钳子并耸肩"/> | 这段代码的运行结果不符合预期。 |
|
|
|
|
|
|
|
|
|
|
在大部分情况,我们会指导你将无法通过编译的代码修改为正确版本。
|
|
|
|
|
|