Skip to content

Latest commit

 

History

History
266 lines (172 loc) · 24 KB

learning-rust-in-2024.md

File metadata and controls

266 lines (172 loc) · 24 KB

2024 年的 Rust 学习指南

2024 年 9 月 21 日 · #rust · #coding · #exercises

目录

这是我的个人指南,教你如何尽快从对 Rust 一无所知到不错的水平。如果我是今天开始学 Rust,那我也会告诉自己这些东西。

TL; DR

  1. 阅读 《半小时学会 Rust》(30 - 60 分钟)
  2. 完成 rustlings(2 - 3 小时)
  3. 花 10 小时用 Rust 编程(8 - 12 小时)
  4. 阅读 《常见的 Rust 生命周期误解》(30 - 60 分钟)
  5. 再花 10 小时用 Rust 编程(8 - 12 小时)
  6. 阅读 《导览 Rust 标准库特征》(2 - 4 小时)

按这样的过程,经过短短的 19 到 30 小时,你将从 Rust 初学者变成 Rust 高级初学者 😎

0)参考资料

学习 Rust 时,建议在浏览器中打开 Rust by ExampleRust 标准库文档。如果你遇到问题,可以在这两个资源中搜索答案。它们的顶部都有搜索栏,方便你快速查找。

其它不错的选择还有 StackOverflow 和 ChatGPT(或者其它你更喜欢的大型语言模型)。几乎每个 Rust 初学者的问题,都在 StackOverflow 上被提问过并得到回答。它们都可以通过 Google 搜索到。至于 ChatGPT,尽管有一半的时间可能给出错误答案,但至少能为你指明大致方向,让你知道下一步去哪里搜索答案。

如果你尝试了以上所有方式,但仍无法解决问题,那可以去一些适合初学者的 Rust 在线社区:r/rust 子版块,r/learnrust 子版块,以及 官方 Rust 用户论坛

另外,最好在浏览器标签页中打开 Rust Playground。这是一个在线的 Rust 代码编辑器和编译器。它非常适合用来调试小的示例,以巩固你在阅读时学到的知识。

相比其他资源,我更推荐 《半小时学会 Rust》。它以一种非常系统和循循渐进的方法介绍 Rust 的语法和概念。它从最简单的例子开始,并在后续的例子中逐渐增加复杂性。这种安排非常符合逻辑,也易于理解。

2)完成 rustlings

Rustlings 是一组按序编排的 Rust 编程小练习。每个练习都是一段无法编译或未能通过单元测试的 Rust 代码。你的任务是修复这些代码,使其能够编译并通过单元测试。

开始 rustlings 之前,你需要安装 Rust。我建议使用 rustup 来管理 Rust 的安装。一旦安装了 rustup,你只需要运行 rustup update,就能随时更新你机器上的 Rust。

用 Rust 编程时,你可以使用任何你喜欢的代码编辑器。但我建议使用支持 rust-analyzer 的编辑器。我使用 VS Code,并安装了 这个扩展 来启用 rust-analyzer。

使用 rustlings 非常简单,可以用 cargo 来安装它。Cargo 是 Rust 的依赖管理器和构建工具,随 Rust 一起安装。如果你使用 rustup 安装 Rust,那么你也会同时会安装 Cargo。

运行 cargo install rustlings 来安装 rustlings。默认情况下,rustlings 的二进制文件会被放在 $HOME/.cargo/bin 中。因此,如果这个路径不在你的 $PATH 变量中,那你应该添加进去,例如:

export PATH="$HOME/.cargo/bin:$PATH"

现在运行 rustlings,它将为你创建一个 rustlings/ 目录,里面包含了所有的练习。在代码编辑器中打开该目录,然后在目录内运行命令 rustlings,并按照其指示操作,它会告诉你应该做哪个练习。完成当前的练习后,命令会告诉你接下来应该做哪个练习。重复这个过程,直到你全部完成。

3)花 10 小时编写 Rust 代码

你可以编写任何代码。但对于你的前 10 小时,我建议使用单线程同步的 Rust。这里面有足够新颖且具有挑战性的 Rust 概念*,足以让你至少忙上 10 小时。很多人甚至需要更长的时间才能完全理解。多线程异步 Rust 引入了更多复杂概念**,在基础知识不牢固之前就开始学习,很容易让人感到不知所措。

*:所有权(ownership)、借用(borrowing)、生命周期(lifetimes)、生命周期省略(lifetime elision)、可变与不可变引用(mutable vs immutable references)、固定大小(sizedness)、解引用强制转换(deref coercion)、特征(traits)、特征对象(trait objects)、泛型(generics)、常量泛型(const generics)、静态与动态分派(static vs dynamic dispatch)、错误处理(error handling)、迭代器(iterators)、模块(modules)、声明宏(declarative macros)、过程宏(procedural macros)...

**:futures、固定(pinning)、轮询(polling)、异步等待(awaiting)、send、sync、取消(cancellation)、流(streams)、sinks、锁(locks)、原子数(atomics)、通道(channels)、actors ...

如果你不知道要写什么代码,那么我有一些建议。

如果你喜欢 rustlings 的难度和节奏,那么你会喜欢《100 个练习学会 Rust》(100 Exercises To Learn Rust,100ELR)。尽管由不同的作者制作,但 100ELR 显然从 rustlings 获得了大量的灵感,更像是后者的延续,。

开始 100 ELR,首先要克隆 mainmatter/100-exercises-to-learn-rust 仓库到你的机器上,接着使用 cargo install --locked workshop-runner 安装测试套件的运行程序,然后就能开始阅读 配套书籍 了。它有 100 章,每章结束时,都会告诉你在仓库中做哪个练习。完成一个练习后,在项目根目录运行 wr 来检查你的解答是否通过了单元测试,如果通过了,就继续下一章。重复这个过程,直到你完成所有练习。

虽然 100 个章节听起来很多,但它们都很短,所以你会比想象中更快地完成它们。大多数人来说。完成整本书可能需要 15 到 25 小时。

然而,如果你觉得 rustlings 太简单,并且想尝试更具挑战性的东西,那么你可能想要跳过 100ELR。

Exercism 上的 Rust 课程

除了 rustlings 和 100ELR 之外,Exercism 上的 Rust 课程 是互联网上最好的 Rust 小练习。它的优秀在于,许多练习是由 Rustaceans(指 Rust 开发者,译者注)制作的,旨在教你 Rust 相较于其它编程语言的独特之处。有一个练习要求你编写一个声明式宏!甚至有一个练习要求你编写不安全的代码!

为了开始该课程,你需要在 Exercism 上注册账户,并加入 Rust 课程(两者都是免费的)。然后,你可以用 Exercism 的在线代码编辑器完成练习,或者将练习下载到你的机器上,使用自己的代码编辑器完成它们,并通过 exercism cli 工具将解答提交到 Exercism 上。

我建议使用 exercism cli 工具。它有很多优点。首先,你的代码编辑器有 rust-analyzer,而 Exercism 的在线代码编辑器没有。其次,你可以在编辑器中使用暗黑模式,但在 Exercism 上只有付费后才能使用(这是高级功能)。第三,你可以使用 git 跟踪你的解答。第四,在编写答案时,你可以选择运行哪些单元测试,而不是每次都运行完整的测试套件。这里 是如何在本地机器上进行练习的官方说明。

Exercism 上的每个练习都有一个「学习模式」和「练习模式」。目前,由于 Exercism 团队正在重新设计,Rust 课程的「学习模式」已被禁用。但不管如何,我认为「练习模式」更好,因为它允许你按任意顺序进行练习。虽然现在没有选择,但如果将来 Rust 课程的「学习模式」和「练习模式」重新开放,我建议选择「练习模式」。

虽然 Rust 课程上的练习是按序的,但这个顺序是任意的,是否遵循并不重要。除了 LuhnLuhn From,和 Luhn Trait 以外,所有其他的练习都彼此无关,可以按任何顺序完成。

完成练习后最好的地方,是去浏览和点赞其他人的解答。我建议完成练习后看看它们,尤其是那些点赞最多的解答,可以教你一些你没有发现的优雅和惯用的 Rust 写法。

练习按难度分为:简单、中等和困难。目前 Rust 课程共有 99 个练习,我认为有 30 个非常好,其他的 59 个只是从其他课程中复制粘贴过来的普通练习。完成整个课程的人占比不到 0.1%。如果完成一半的人不到 1%,我也丝毫不会吃惊。我已经完成了所有练习。考虑到你可能不会完成所有练习,所以我将推荐我认为最好的那些。

你应该从简单练习开始。难度方面,它们比你在 rustlings 或 100ELR 中的稍微更具挑战性。质量方面,它们都还不错。完成任何一个简单练习都不会超过 20 分钟。另外,如果完成简单练习不再让你感到有收获,那就转到中等练习。不要强迫自己完成所有的简单练习。

就中等难度而言,以下是我个人认为的最好练习(排名不分先后):

根据你选择的练习,完成时间可能需要 10 到 45 分钟。

当你准备好再次提高难度时,以下是我认为最好的困难练习(排名不分先后):

根据你选择的练习,完成时间可能需要 30 到 90 分钟。

完成一系列简单练习,再加上我推荐的中等和困难练习,大概会花费约 20 小时。完成整个课程可能需要两倍的时间,约 40 小时。话虽如此,如果你觉得自己开始失去兴趣,就不要勉强自己完成整个课程。此时最好调整方向,尝试 Rust 的其它东西。学习过程中最重要的事,是保持乐趣。

Advent of Code(AoC)是一组编程谜题。自 2015 年起,每年从 12 月 1 日到 25 日,每天都会发布一个新的谜题,每个谜题有两个部分。每年的前 10-15 个谜题往往是简单或中等难度,最后 10-15 个谜题通常很难。谜题被设计成与语言无关,意味着你可以使用任何编程语言来解决。如果你的目标是学习 Rust,那么仅完成谜题并不会给你太多帮助。但如果完成一个谜题后,再看看一位经验丰富的 Rustacean 的解决方案,就可能会帮你学到 Rust 的很多知识。

在这里,这位经验丰富的 Rustacean 就是 fasterthanlime。他不仅发布了 2020 年和 2022 年 AoC 谜题的解答,还写了一些面向初学者的博客文章,解释每个谜题的解决思路。如果你打算通过 AoC 学习 Rust,那么你应该从 2020 年的谜题开始,在完成每个谜题后,阅读 fasterthanlime 对应的博客文章。无论是哪一年,我都不建议做第 10 个之后的谜题,因为它们可能会变得极具挑战性,你会绞尽脑汁,花费大部分时间去想如何解决问题,而不是学习 Rust。

设置

首先,在 AoC 上创建账号。其次,由于 AoC 与语言无关,你必须设置你自己的 cargo 项目并搭建脚手架来解决这些谜题。这样做可能非常有教育意义,但也相当枯燥。我建议跳过这一步,使用这个 Github 模板:fspoettel/advent-of-code-rust:点击 Use this template -> Create a new repository,然后 git clone 克隆仓库到你的机器上。在 .cargo/config.toml 中将 AOC_YEAR 设置为 2020

你还可以安装 aoc-cli 工具,从你的 AoC 账户获取指令和输入到你的机器上。为此,要运行 cargo install aoc-cli --version 0.12.0,然后创建文件 $HOME/.adventofcode.session,并将你的 AoC 的 cookie 粘贴进去。获取 cookie,需要在 AoC 网站中,按 F12 打开浏览器开发者工具,然后在 ApplicationStorage 选项卡下找到 Cookies,复制 session cookie 的值。

完成这些步骤后,你可以在项目目录中运行 cargo download {day},生成脚手架并下载当天的谜题。一旦你认为已经完成,就可以运行 cargo solve {day},通过 AoC 网站提交解答并进行验证。例如,对于第 1 天,命令将是 cargo download 1cargo solve 1

2020 年

正如前面提到的,一定要在 .cargo/config.toml 中将 AOC_YEAR 设置为 2020。完成一个谜题后,去阅读 fasterthanlime 在他的博客上发布的解决方案。这是他前 10 个谜题解决方案的链接:

  1. AoC 2020 Day 1
  2. AoC 2020 Day 2
  3. AoC 2020 Day 3
  4. AoC 2020 Day 4
  5. AoC 2020 Day 5
  6. AoC 2020 Day 6
  7. AoC 2020 Day 7
  8. AoC 2020 Day 8
  9. AoC 2020 Day 9
  10. AoC 2020 Day 10

2022 年

如果你已经完成了至少 10 个 2020 年的谜题,那么推荐接下来做 2022 年的谜题。再克隆一份 fspoettel/advent-of-code-rust,并在 .cargo/config.toml 中将 AOC_YEAR 设置为 2022。这是 fasterthanlime 对 2022 年谜题的解答的链接:

  1. AoC 2022 Day 1
  2. AoC 2022 Day 2
  3. AoC 2022 Day 3
  4. AoC 2022 Day 4
  5. AoC 2022 Day 5
  6. AoC 2022 Day 6
  7. AoC 2022 Day 7
  8. AoC 2022 Day 8
  9. AoC 2022 Day 9
  10. AoC 2022 Day 10

教程

大多数 Rust 教程的目标,是向你展示如何用 Rust 实现某个软件,而不一定是教你 Rust 语言本身。因此,许多教程作者都假设读者已经对这门语言有一定的了解,为了保持教程的重点和简洁,会省略许多针对初学者的解释。

话虽如此,编写一个有一定难度的软件,比完成一堆小练习要更有趣和更有成就感。所以这种方法可能更适合保持你的学习动力,特别是当你在构建一个你真正感兴趣和兴奋的东西时。

我希望在这里推荐一些教程。但是已经有太多教程,很难一一评估和按质量排名。不过,质量可能并不是那么重要,重要的是你在编写 Rust 代码并享受这个过程。所以,选择任何看起来有趣的教程并跟着学习,不要过分纠结细节。

不过,我要特别提一下 Codecrafters。他们的教程质量非常高,而且所有教程都提供了 Rust 模板。在教程的每一步,他们都会给出指导和提示,告诉你如何实现程序的下一部分。你完成并提交代码后,它会运行一个测试套件,来检查是否所有内容都正确实现。

Codecrafters 的最大缺点是费用,每月要 40 美元。他们偶尔会有促销活动,免费开放某个教程一个月。你在浏览他们网站时,可能会幸运地发现一个你感兴趣的教程是免费的。然而,这个定价表明,他们的目标是那些希望培训其工程师的软件公司,而不是个人工程师。如果你在这样的公司工作,可以查看你的公司是否为类似 Codecrafters 的课程提供培训津贴,这样你就可以用这些津贴来支付费用。

免责声明:这是我写的。

阅读 《常见的 Rust 生命周期误解》 将帮助你理解,为什么在过去的 10 个小时的 Rust 编程中,你一半的尝试都不起作用 🙂

玩笑归玩笑,理解生命周期可能是许多初学者在学习 Rust 时遇到的最大绊脚石。这篇文章澄清了关于生命周期的最常见误解,它们常常引起人们的困惑和挫败感。

我之所以建议在至少有 10 小时的 Rust 编码实践经验后再阅读它,是因为对纯粹的初学者来说,这篇文章可能包含了过多的技术细节,会让人感到不知所措,而不是提供帮助。

5)再花 10 小时用 Rust 编程

如果你仍然不知道要编写什么代码,我的建议保仍然是:100 个练习学会 Rust,Exercism 上的 Rust 课程Advent of Code,或其它教程。

现在你已经有了一些 Rust 经验。如果你喜欢冒险,可以尝试用 Rust 编写一些多线程异步代码。

免责声明:这是我写的。

特征(Trait)是 Rust 中编写多态代码的主要方式。它们无处不在,尤其是对来自标准库的特征来说。本文对最常见的标准库特征进行了导览,介绍了它们的方法、如何使用它们以及何时为你的自定义类型实现它们。这篇文章相当详尽,并分享了大量实用的技巧。尽管篇幅较长,但你不必读阅读全文就能从中受益,所以不要被它的长度吓到。

接下来做什么?

恭喜你!你做到了。你肯定已经掌握了足够的 Rust 知识,可以自行探索前进的道路。祝你好运并玩得开心。

荣誉提名

这些是我非常喜欢的其他的 Rust 初学者资源,但我不知道应该将它们放在本指南的何处。

这是一个非常好的资源。然而,它涉及很多其他资源已经覆盖的内容,所以为了保持指南的简洁性,我没有将其包括在内。

这是 Google 的 Android 团队开发的 Rust 课程。它是一个幻灯片集合,本应由一位具有 Rust 经验的讲者来讲解,但书籍版本在每页底部有讲者注释,因此也可以作为独立资源来学习。

这门课程非常简洁,节奏很快,同时还涵盖了其他初学者资源中通常忽略的 Rust 部分,例如 裸机 RustRust 中的并发性。然而,因为它更适合由讲者来呈现,所以不太适合放入面向自学者的指南中。

这是一篇很棒的文章。它可以放在该指南中的任何地方,所以我不确定将它放在哪里。理想情况下,学习者开始将 Rust 代码分散到多个文件时,应该阅读这篇文章。在每个人的 Rust 编码旅程中,这个时间点会有所不同。无论如何,当你到了那一步时,请阅读这篇文章。

讨论

在以下平台讨论本文:

进一步阅读