Statistics
14
Views
0
Downloads
0
Donations
Uploader

高宏飞

Shared on 2025-12-19
Support
Share

AuthorSteve Klabnik, Carol Nichols, Contributions from the Rust Community, [译] Rust 中文翻译项目组

Rust 程序设计语言 中文 也译为 Rust 权威指南,是 Rust 官方推出的学习 Rust 的必备教程。Rust Wiki 版的 Rust 程序设计语言简体中文版将由 Rust 中文翻译项目组持续维护和更新,确保内容最新最全。

Tags
No tags
Publish Year: 2022
Language: 英文
File Format: PDF
File Size: 13.5 MB
Support Statistics
¥.00 · 0times
Text Preview (First 20 pages)
Registered users can read the full content for free

Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.

(This page has no text content)
Rust 程序设计语⾔ 由 Steve Klabnik 和 Carol Nichols,以及来⾃ Rust 社区贡献者撰写 中⽂翻译注(Chinese translation of the The Rust Programming Language): 1. 👉 查看更多 Rust 官⽅⽂档中英⽂双语教程,本站还提供了 Rust 标准库 中⽂版。 2. 本站翻译已参照最新的 Rust 1.58.0 版及开发版进⾏调整,这是⽬前⽹上 最新的中⽂版本,最后更新时间 2022 年 2 ⽉ 6 ⽇。 3. 《Rust 程序设计语⾔》(The Rust Programming Language 中⽂版) 翻 译⾃ The Rust Programming Language,查看此书的 GitHub 翻译项⽬ 和源码。 4. 《Rust 程序设计语⾔》中⽂出版书名为《Rust 权威指南》,参⻅“为什么 The Rust Programming Language 在线版书名翻译成《Rust 程序设计 语⾔》”。 5. 本书已有由 KaiserY 翻译完的版本,Rust 中⽂翻译项⽬组将把之前未翻 译完的内容直接采⽤ KaiserY 版内容,后续 Rust 中⽂翻译项⽬组将跟随 Rust 官⽅的英⽂版本更新,进⼀步查看本书翻译说明。 6. 本站⽀持⽂档中英⽂切换,点击⻚⾯右上⻆语⾔图标可切换到相同章节的 英⽂⻚⾯,英⽂版每天都会⾃动同步⼀次官⽅的最新版本。 7. 若发现当前⻚表达错误或帮助我们改进翻译,可点击右上⻆的编辑按钮打 开该⻚对应源码⽂件进⾏编辑和修改,Rust 中⽂资源的开源组织发展离 不开⼤家,感谢您的⽀持和帮助! 本书的版本假定你使⽤ Rust 1.58(2022 年 1 ⽉ 13 ⽇发布)或更⾼版本。请参阅第 1 章的“安装”章节来安装或更新 Rust。 本⽂档的 HTML 格式在线版为 https://rustwiki.org/zh-CN/book/ (英⽂版为: https://doc.rust-lang.org/stable/book/);⽽离线版在使⽤ rustup 安装 Rust 后 附带(注:⽬前此命令附带的⽂档只包含英⽂版,中⽂离线版可拉取本书的中⽂翻译 GitHub 仓库⽣成) ,运⾏ rustup docs --book 来打开本书。 本⽂档还提供了⼀些社区翻译版本。
可以从 No Starch Press 获得纸质图书和电⼦书(注:中⽂出版书名为《Rust 权威 指南》,可从购书平台中购买)。
前⾔ 虽然不是那么明显,但是 Rust 编程语⾔从根本上讲就是关于赋能的:⽆论你现在编 写哪种代码,Rust 都能让你在更⼴泛的编程领域中⽐以前⾛得更远,更⾃信。 例如,“系统级”⼯作涉及内存管理、数据表⽰和并发性的底层细节。传统上,这是⼀ 个神秘的编程领域,只有花费了必要时间来学习避免其臭名昭著的陷阱的少数⼈才会 涉及到。甚⾄那些实践者也要谨慎⾏事,以免代码出现漏洞,崩溃或损坏。 Rust 破除了这些障碍:它消除了旧的陷阱,并提供了⼀套友好、完善的⼯具集帮助 你,来打破这些障碍。需要“深⼊”到较底层控制的开发者可以使⽤ Rust 来做到这⼀ 点,⽽⽆需担⼼崩溃或安全漏洞的常⻅⻛险,也⽆需学习纷繁复杂的⼯具链细节。更 好的是,Rust 语⾔旨在引导你⾃然地编写出在运⾏速度和内存使⽤⽅⾯都⾼效的可 靠代码。 已经在从事编写底层代码的开发者都可使⽤ Rust 来提⾼⾃⼰的抱负。例如,在 Rust 中引⼊并⾏性是⼀个相对较低⻛险的操作:编译器会为你找到典型的错误。同时,你 可以在代码中采取更加激进的优化,⽽不⽤担⼼意外引⼊崩溃或漏洞。 但 Rust 并不局限于底层系统编程。它表达⼒强、写起来舒适,让⼈能够轻松地编写 出命令⾏应⽤、⽹络服务器等各种类型的代码————在本书后⾯将给出这两种应⽤ 的简单⽰例。使⽤ Rust 能让你把在⼀个领域中学习到的技能迁移到另⼀个领域:你 可以通过编写 Web 应⽤来学习 Rust,然后将这些相同的技能应⽤于你的树莓派 (Raspberry Pi,属于嵌⼊式⽅⾯)上。 本书充分体现了 Rust 增强⽤⼾编程能⼒的潜⼒。其内容通俗易懂,不仅可以帮助你 提⾼对 Rust 的了解,还可以提升你⾝为开发者的能⼒和⾃信。准备好,现在就开始 学习吧——欢迎加⼊ Rust 社区! — Nicholas Matsakis 和 Aaron Turon
简介 注意:本书的版本(英⽂版)与出版的 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 意义 这些代码不能编译!
Ferris 意义 这些代码会 panic! 这些代码没有产⽣期望的⾏为。 在⼤部分情况,我们会指引你将任何不能编译的代码纠正为正确版本。 源代码 ⽣成本书的源码可以在 GitHub (英⽂原书的 GitHub) 上找到。
⼊⻔指南 让我们开始 Rust 之旅吧!有很多内容需要学习,但每次旅程总有起点。在本章中, 我们会讨论: 在 Linux、macOS 和 Windows 上安装 Rust 编写⼀个打印 Hello, world! 的程序 使⽤ cargo,这是 Rust 的包管理器和构建系统
安装 第⼀步是安装 Rust。我们将通过 rustup 来下载 Rust,这是⼀个管理 Rust 版本和 相关⼯具的命令⾏⼯具。这需要互联⽹连接才能下载。 注意:如果你出于某些原因不想⽤ rustup,请参阅 Rust 其他安装⽅法的⻚⾯ 了解更多选项。 下⾯步骤将安装 Rust 编译器的最新稳定版本。Rust 的稳定性保证可确保本书中所有 能编译的⽰例在更新的 Rust 版本中能够继续通过编译。不同版本之间的输出可能会 略有不同,因为 Rust 经常会改进错误消息和警告。也就是说,任何通过这些步骤安 装的较新稳定版本的 Rust 应该都可以正常运⾏本书的内容。 命令⾏符号 在本章以及整本书中,我们将展⽰⼀些在终端中使⽤的命令。在终端中输⼊的 ⾏均以 $ 开头,你不需输⼊ $ 字符;它表⽰每个命令的开始。不以 $ 开头的 ⾏通常表⽰上⼀个命令的输出内容。另外,专⽤于 PowerShell 的⽰例将使⽤ > ⽽不是 $。 在 Linux 或 macOS 上安装 rustup 如果你使⽤的是 Linux 或 macOS,打开终端并输⼊下⾯命令: 这个命令将下载⼀个脚本并开始安装 rustup ⼯具,此⼯具将安装 Rust 的最新稳定 版本。可能会提⽰你输⼊密码。如果安装成功,将出现下⾯这⾏: $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
此外,你还需要⼀个链接器(linker),这是 Rust ⽤来将其编译的输出关联到⼀个 ⽂件中的程序。很可能你已经有⼀个了。如果你遇到了链接器错误,请尝试安装⼀个 C 编译器,其通常包括⼀个链接器。C 编译器也很有⽤,因为⼀些常⻅的 Rust 包依 赖于 C 代码,因此需要安装⼀个 C 编译器。 在 macOS 上,可运⾏以下命令获得 C 编译器: Linux ⽤⼾⼀般应按照相应发⾏版的⽂档来安装 GCC 或 Clang。例如,如果你使⽤ Ubuntu,则可安装 build-essential 包。 在 Windows 上安装 rustup 在 Windows 上,访问 https://www.rust-lang.org/zh-CN/tools/install ⻚⾯并按照 说明安装 Rust。在安装过程的某个步骤,你可能会收到⼀条消息,提⽰你还需要适 ⽤于 Visual Studio 2013 或更⾼版本的 C++ 的构建⼯具(C++ build tools)。获取 这些构建⼯具的最简单⽅法是安装 Visual Studio 2019 的构建⼯具。当被问及要安装 哪些内容时,请确保已选择 “C++ build tools”,并包括 Windows 10 SDK 和英⽂语 ⾔包。 本书的其余部分使⽤的命令⾏在 cmd.exe 和 PowerShell 中都可以运⾏。如果有特 定差异,我们将说明使⽤哪个。 更新和卸载 通过 rustup 安装 Rust 后,更新到最新版本很简单。在 shell 中运⾏以下更新命 令: 要卸载 Rust 和 rustup,在 shell 中运⾏以下卸载命令: Rust is installed now. Great! $ xcode-select --install $ rustup update
疑难解答 要检查是否正确安装了 Rust,可打开 shell 并输⼊下⾯这⾏: 你应该看到最新发布的稳定版本的版本号、提交哈希值和提交⽇期,如下所⽰格式: 如果你看到此信息,则说明您已成功安装 Rust!如果没看到此信息,并且你使⽤的 是 Windows,请检查 Rust 是否在 %PATH% 系统变量中。如果都正确,但 Rust 仍 然⽆法正常⼯作,那么你可以在很多地⽅获得帮助。最简单的是去 Rust 官⽅ Discord 的 #beginners 频道 。在这⾥,你可以和其他 Rustacean(Rust ⽤⼾,⾃ 嘲的昵称)聊天并寻求帮助。其他不错的资源还有 Rust ⽤⼾论坛和 Stack Overflow。 本地⽂档 Rust 的安装还⾃带⽂档的本地副本,可以⽅便地离线阅读。运⾏ rustup doc 让浏 览器打开本地⽂档。 每当遇到标准库提供的类型或函数不知道怎么⽤时,都可以在 API ⽂档中查找到! $ rustup self uninstall $ rustc --version rustc x.y.z (abcabcabc yyyy-mm-dd)
Hello, World! 我们已经安装好了 Rust,接着编写第⼀个 Rust 程序。按照传统,在学习⼀⻔新语⾔ 时都会编写⼀个输出“Hello, world!”(你好,世界)的简单程序,本章我们也是如 此。 注意:本书假定你已经熟悉基本的命令⾏。Rust 本⾝对编辑器、⼯具或代码存 放的位置都没有特殊要求。所以要是你更喜欢 IDE ⽽不是命令⾏的话,可以随 意选⽤你喜爱的 IDE。⽬前很多 IDE 都提供了⼀定程度的 Rust ⽀持。有关详细 信息,请查看 IDE 的⽂档。最近,Rust 团队⼀直致⼒于提供出⾊的 IDE ⽀持, 并且在这⽅⾯取得了迅速的进步! 创建项⽬⽬录 ⾸先,创建⼀个存放 Rust 代码的⽬录。Rust 不关⼼代码存放的位置,但是对于本书 中的练习和项⽬,我们建议在操作系统的主⽬录(home,在 Windows 下即⽤⼾⽬ 录)中创建⼀个 projects ⽬录,并保存你的全部项⽬。 打开终端,输⼊下⾯命令来创建 projects ⽬录,以在此⽬录⾥⾯创建 “Hello, world!” 项⽬⽬录。 对于 Linux、macOS 和 Windows 的 PowerShell,请输⼊以下命令: 对于 Windows CMD,输⼊以下内容: $ mkdir ~/projects $ cd ~/projects $ mkdir hello_world $ cd hello_world
编写和运⾏ Rust 程序 接下来,创建⼀个源⽂件并命名为 main.rs。Rust ⽂件通常以 .rs 扩展名结尾。如果 ⽂件名中使⽤了多个单词,请使⽤下划线将它们隔开。例如,命名为 hello_world.rs,⽽不是 helloworld.rs。 现在打开刚创建好的 main.rs ⽂件,输⼊⽰例 1-1 中的代码。 ⽂件名:main.rs ⽰例 1-1:⼀个打印 Hello, world! 的程序 保存⽂件,并回到终端窗⼝。在 Linux 或 macOS 上,输⼊以下命令,编译并运⾏⽂ 件: 在 Windows 上,输⼊ .\main.exe 来代替 ./main: 不管你使⽤哪种操作系统,该字符串 Hello, world! 都应打印到了终端上。如果看 不到此输出,请参考“安装”⼩节的“疑难解答”⼩节来查找解决⽅法。 > mkdir "%USERPROFILE%\projects" > cd /d "%USERPROFILE%\projects" > mkdir hello_world > cd hello_world fn main() { println!("Hello, world!"); } $ rustc main.rs $ ./main Hello, world! > rustc main.rs > .\main.exe Hello, world!
如果 Hello, world! 打印成功,那么祝贺你!你已经正式编写了⼀个 Rust 程序。 你已经成为了⼀名 Rust 开发者——欢迎加⼊ Rust ⼤家庭! Rust 程序剖析 让我们详细回顾⼀下 “Hello, world!” 程序发⽣了什么。这是拼图的第⼀块: 这⼏⾏定义了 Rust 的函数。 main 函数(也称为主函数)很特殊:它始终是每个可 执⾏ Rust 程序中运⾏的第⼀个代码。第⼀⾏声明⼀个名为 main 的函数,不带参数 也没有返回值。如果有参数,那么它们的名字会放到括号内,它们将放在括号 () 内。 另外,请注意,函数主体⽤⼤括号 {} 括起来。Rust 需要函数体的所有内容都被括 号包围起来。⼀种好的代码⻛格是将左⼤括号放在函数声明的同⼀⾏,且之间带有⼀ 个空格。 如果想在 Rust 项⽬中坚持标准代码⻛格,则可以使⽤⾃动格式化程序⼯具 rustfmt 来将代码格式化为特定⻛格。Rust 团队已将此⼯具包含在标准 Rust 发⾏版中(如 rustc),因此它应该已经安装在你的计算机上!更多相关详细信息,请查看在线⽂ 档。 main 函数内部是以下代码: 该⾏完成了此简单程序中的所有⼯作:它将⽂本打印到屏幕上。这⾥有 4 个要注意的 重要细节。 ⾸先,Rust ⻛格的缩进使⽤ 4 个空格,⽽不是制表符。 其次, println! 调⽤ Rust 宏。如果改为调⽤函数,则应该将其输⼊为 println (不含 !)。我们将在第 19 章中更详细地讨论 Rust 宏。现在只需要知道,当看到 ⼀个 !,则意味着调⽤的是宏⽽不是普通的函数。 fn main() { } println!("Hello, world!");
第三,你看到 "Hello, world!" 字符串。我们将这个字符串作为参数传递给 println!,接着 println! 将字符串打印到屏幕上。 第四,我们⽤分号( ;,注意这是英⽂分号)结束该⾏,这表明该表达式已结束,下 ⼀个表达式已准备好开始。Rust 代码的⼤多数⾏都以⼀个 ; 结尾。 编译和运⾏是独⽴的步骤 刚才我们运⾏⼀个新创建的程序。现在我们将分解这个过程,并检查每个步骤。 在运⾏ Rust 程序之前,必须使⽤ Rust 编译器来编译它,输⼊ rustc 命令并传⼊源 ⽂件的名称,如下所⽰: 如果有 C 或 C++ 语⾔基础,你会注意到这点和 gcc 或 clang 类似。编译成功后, Rust 就会输出⼀个⼆进制可执⾏⽂件。 在 Linux、macOS 或 Windows 的 PowerShell 中,可通过输⼊ ls 命令来查看可执 ⾏⽂件。在 Linux 和 macOS 中,你将看到两个⽂件。使⽤ Windows 的 PowerShell,你将看到与使⽤ CMD 相同的三个⽂件。 对于 Windows 的 CMD,可输⼊以下内容: 这显⽰了带有 .rs 扩展名的源代码⽂件,可执⾏⽂件(在 Windows 上是 main.exe, 在所有其他平台上是 main),以及在使⽤ Windows 时包含⼀个带有 .pdb 扩展名的 调试信息的⽂件。在这⾥,运⾏ main 或 main.exe ⽂件,如下所⽰: $ rustc main.rs $ ls main main.rs > dir /B %= the /B option says to only show the file names =% main.exe main.pdb main.rs $ ./main # or .\main.exe on Windows
如果 main.rs 是 “Hello, world!” 程序,这将会打印 Hello, world! 到终端上。 如果你只熟悉动态语⾔,如 Ruby、Python 或 JavaScript,你很可能不习惯分多个步 骤来编译和运⾏程序的⽅式。Rust 是⼀⻔预编译(ahead-of-time compiled)语⾔,这 意味着你可以编译⼀个程序,将编译后的可执⾏⽂件给别⼈,即使他们没有安装 Rust 也可以运⾏程序。如果你为其他⼈提供 .rb、.py 或 .js ⽂件,那么对⽅也需要分 别安装对应 Ruby、Python 或 JavaScript 的语⾔⽀持环境。但是在这些语⾔中,只 需要⼀条命令来编译和运⾏程序。⼀切都是语⾔设计权衡的结果。 使⽤ rustc 编译对简单的程序可以轻松胜任,但随着项⽬的增⻓,你将会想要管理 项⽬中所有相关内容,并想让其他⽤⼾和项⽬能够容易共享你的代码。接下来,我们 将引⼊ Cargo ⼯具,这将帮助你学会编写真实开发环境的 Rust 程序。
Hello, Cargo! Cargo 是 Rust 的构建系统和包管理器。⼤多数 Rustacean 们使⽤ Cargo 来管理他 们的 Rust 项⽬,因为它可以为你处理很多任务,⽐如构建代码、下载依赖库,以及 编译这些库。(我们把代码所需要的库叫做依赖(dependency))。 最简单的 Rust 程序(如我们刚刚编写的)不含任何依赖。所以如果使⽤ Cargo 来构 建 “Hello, world!” 项⽬,将只会⽤到 Cargo 构建代码的那部分功能。在编写更复杂 的 Rust 程序时,你将添加依赖项,如果使⽤ Cargo 启动项⽬,则添加依赖项将更容 易。 由于绝⼤多数 Rust 项⽬使⽤ Cargo,本书接下来的部分假设你也使⽤ Cargo。如果 使⽤“安装” 部分介绍的官⽅安装包的话,则⾃带了 Cargo。如果通过其他⽅式安装的 话,可以在终端输⼊如下命令检查是否安装了 Cargo: 如果你看到了版本号,说明安装成功!如果看到类似 command not found 的错误, 你应该查看相应安装⽂档以确定如何单独安装 Cargo。 使⽤ Cargo 创建项⽬ 我们使⽤ Cargo 创建⼀个新项⽬,然后看看与上⾯的 Hello, world! 项⽬有什么不 同。回到 projects ⽬录(或者你存放代码的⽬录)。接下来,可在任何操作系统下运 ⾏以下命令: 第⼀⾏命令新建了名为 hello_cargo 的⽬录。我们将项⽬命名为 hello_cargo,同时 Cargo 在⼀个同名⽬录中创建项⽬⽂件。 进⼊ hello_cargo ⽬录并列出⽂件。将会看到 Cargo ⽣成了两个⽂件和⼀个⽬录:⼀ 个 Cargo.toml ⽂件,⼀个 src ⽬录,以及位于 src ⽬录中的 main.rs ⽂件。 $ cargo --version $ cargo new hello_cargo $ cd hello_cargo
它也在 hello_cargo ⽬录初始化了⼀个 Git 仓库,并带有⼀个 .gitignore ⽂件。如果在 现有的 Git 仓库中运⾏ cargo new,则不会⽣成 Git ⽂件;但你可以使⽤ cargo new --vcs=git 来⽆视此限制,强制⽣成 Git ⽂件。 注意:Git 是⼀个常⽤的版本控制系统(version control system, VCS)。可 以通过 --vcs 参数使 cargo new 切换到其它版本控制系统,或者不使⽤ VCS。运⾏ cargo new --help 查看可⽤的选项。 使⽤你喜欢的⽂本编辑器打开 Cargo.toml ⽂件。它应该看起来如⽰例 1-2 所⽰: ⽂件名:Cargo.toml ⽰例 1-2:cargo new 命令⽣成的 Cargo.toml 的内容 此⽂件使⽤ TOML (Tom's Obvious, Minimal Language) 格式,这是 Cargo 配置⽂件的 格式。 第⼀⾏, [package],是⼀个表块(section)标题,表明下⾯的语句⽤来配置⼀个 包(package)。随着我们在这个⽂件增加更多的信息,还将增加其他表块。 接下来的三⾏设置了 Cargo 编译程序所需的配置:项⽬的名称、版本,以及使⽤的 Rust ⼤版本号(edition,区别于 version)。附录 E 会介绍 edition(译注:Rust 的核⼼版本,即 2015、2018、2021 版等) 的值。 最后⼀⾏, [dependencies] 是⼀个表块的开头,你可以在其中列出你的项⽬所依赖 的任何包。在 Rust 中,代码包被称为 crate。这个项⽬并不需要其他的 crate,不过 在第 2 章的第⼀个项⽬会⽤到依赖,那时会⽤得上这个表块。 现在打开 src/main.rs 看看: ⽂件名:src/main.rs [package] name = "hello_cargo" version = "0.1.0" edition = "2021" [dependencies]
The above is a preview of the first 20 pages. Register to read the complete e-book.