前言
“代码更像是‘指导原则’,而非实际规则。” —— 赫克托·巴博萨
在拥挤的现代编程语言领域,Rust 与众不同。Rust提供了编译型语言的速度、非GC型语言的效率和函数式语言的类型安全——同时提供了解决内存安全问题的独特方案。因此,Rust经常被评选为最受欢迎的编程语言。
Rust类型系统的强大和一致性意味着,如果Rust程序通过编译,它已有相当大的机会正常运行——这种现象以前只有在Haskell等更学术、更不易理解的语言中才能观察到。如果Rust程序编译成功,它也将安全的运行。
然而,这种安全(包括类型安全和内存安全)是有代价的。尽管基础文档的质量很高,但Rust仍以其陡峭的入门坡度而闻名,新手必须经历与借用检查器作斗争、重新设计数据结构以及被生命周期所困扰的入门仪式。一个通过编译的Rust程序有很大机会第一次就能正常运行,但让它通过编译是真的困难——即使Rust编译器的错误诊断非常有用。
本书面向的读者
本书试图帮助程序员解决这些困难领域,即使他们已经拥有使用 C++ 等现有编译语言的经验。因此,与其他 Effective <Language> 书籍一样,本书旨在成为 Rust 新手可能需要的第二本书,因为他们已经在其他地方接触过基础知识,例如《Rust 编程语言》(Steve Klabnik 和 Carol Nichols,No Starch Press)或《Rust 编程》(Jim Blandy 等,O'Reilly)。
但是,Rust 的安全性导致此处的条款略有不同,尤其是与 Scott Meyers 的原始 Effective C++ 系列相比。C++ 语言曾经(现在也是)充满了陷阱,因此 Effective C++ 专注于收集避免这些陷阱的建议,这些建议基于使用 C++ 创建软件的实际经验。值得注意的是,它包含的是指南而不是规则,因为指南有例外——提供指南的详细理由可以让读者自己决定他们的特定情况是否值得违反规则。
这里保留了给出建议的一般风格以及建议的理由。然而,由于 Rust 几乎没有任何陷阱,这里的条款更多地集中在 Rust 引入的概念上。许多条款的标题是“理解……”和“熟悉……”,并有助于编写流畅、惯用的 Rust。
Rust 的安全性还导致完全没有标题为“永远不要……”的条款。如果你真的不应该做某事,编译器通常会阻止你做这件事。
Rust版本
本书是为 2018 年版 Rust 编写的,使用了稳定的工具链。Rust 的向后兼容性承诺意味着,任何后续版本的 Rust(包括 2021 年版)仍将支持为 2018 年版编写的代码,即使后续版本引入了重大更改。Rust 现在也足够稳定,2018 年版和 2021 年版之间的差异很小;书中的代码都不需要修改即可符合 2021 年版的要求(但第 19 项包含一个例外,即后续版本的 Rust 允许以前不可能实现的新行为)。
此处的条目不涵盖 Rust 异步功能的任何方面,因为这涉及更高级的概念和不太稳定的工具链支持——同步 Rust 已经有足够的内容可以涵盖。也许未来会出现一种有效的异步 Rust……
用于代码片段和错误消息的特定 rustc 版本是 1.70。代码片段不太可能需要为后续版本进行更改,但错误消息可能会因特定编译器版本而异。文本中包含的错误消息也经过手动编辑以适合本书的宽度限制,但其他方面均由编译器生成。
文本中有许多对其他静态类型语言(如 Java、Go 和 C++)的引用和比较,以帮助有这些语言经验的读者进行定位。(C++ 可能是最接近的等效语言,尤其是当 C++11 的移动语义发挥作用时。)
本书导读
本书的内容分为六章:
- 第 1 章 — types:围绕 Rust 核心类型系统的建议
- 第 2 章 — traits:使用 Rust trait的建议
- 第 3 章 — 概念:构成 Rust 设计的核心思想
- 第 4 章 — 依赖项:使用 Rust 包生态系统的建议
- 第 5 章 — 工具:超越 Rust 编译器来改进代码库的建议
- 第 6 章 — 超越标准 Rust:当您必须在 Rust 标准、安全环境之外工作时的建议
虽然“概念”一章可以说比“types”和“traits”一章更基础,但它被故意放在本书的后面,以便从头到尾阅读的读者可以先建立一些信心。
本书中使用的约定
本书中使用了以下印刷约定:
- 斜体:表示新术语、URL、电子邮件地址、文件名和文件扩展名。
- 等宽:用于程序列表,以及段落内引用程序元素,例如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。
以下标记用于标识某些方面不正确的代码: | 标记 | 含义 | | ---- | ---- | | x | 该代码无法编译!| | ? | 此代码未产生所需的行为。|
致谢
我要感谢帮助本书问世的人们:
- 对文本各个方面提供专业和详细反馈的技术审阅者:Pietro Albini、Jess Males、Mike Capp,尤其是 Carol Nichols。
- 我在 O'Reilly 的编辑:Jeff Bleiel、Brian Guerin 和 Katie Tozer。
- Tiziano Santoro,我从他那里学到了很多关于 Rust 的知识。
- Danny Elfanbaum,为处理本书的 AsciiDoc 格式提供了重要的技术帮助。
- 本书原始网络版的勤奋读者,特别是:
- Julian Rosse,他发现了在线文本中的数十处拼写错误和其他错误。
- Martin Disch,他指出了几个项目中潜在的改进和不准确之处。
- Chris Fleetwood、Sergey Kaunov、Clifford Matthews、Remo Senekowitsch、Kirill Zaborsky 和一位匿名的 Proton Mail 用户指出了文中的错误。
- 我的家人,他们帮助我度过了许多因写作而分心的周末。