通过调试 Rust 代码学习 Rust

Rustlings 是 Rust 团队的一个开源项目,它通过调试过程帮助你学习 Rust。
2 位读者喜欢这篇文章。
Ferris the crab under the sea, unofficial logo for Rust programming language

Opensource.com

在我之前的 关于 rustup 的文章中,我向您展示了如何安装 Rust 工具链。 如果你不用它来更多地亲身实践 Rust,那工具链又有什么用呢? 学习任何语言都涉及到阅读现有代码和编写大量示例程序。 这是精通一门语言的好方法。 然而,还有第三种方法:调试代码。

通过调试学习包括尝试编译一个预先编写的(有错误的)示例程序,理解编译器生成的错误,修复示例代码,然后重新编译它。 重复这个过程直到代码成功编译和运行。

Rustlings 是 Rust 团队的一个开源项目,它通过调试过程帮助你学习 Rust。 它还为你提供了许多提示。 如果你是 Rust 的初学者,并且已经开始或完成了 Rust 书籍的阅读,那么 rustlings 将是理想的下一步。 Rustlings 可以帮助你应用从书中学习到的知识,并开始从事更大的项目。

安装 rustlings

我正在使用(并推荐)Fedora 机器来尝试 rustlings,但任何 Linux 发行版都可以。 要安装 rustlings,你必须下载并运行它的安装脚本。 建议你以普通用户(而不是 root)身份执行此操作,而无需任何特殊权限。

请记住,要能够使用 rustlings,你需要系统上可用的 Rust 工具链。 如果你还没有,请参阅我关于 rustup 的文章

准备好后,下载安装脚本

$ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh  > rustlings_install.sh
$ file rustlings_install.sh
rustlings_install.sh: Bourne-Again shell script, ASCII text executable

检查脚本以了解它的作用

$ less rustlings_install.sh

然后运行它进行安装

$ bash rustlings_install.sh
[...]
Installing /home/tux/.cargo/bin/rustlings
Installed package `rustlings v4.8.0 (/home/tux/rustlings)` (executable `rustlings`)
All done!

运行 'rustlings' 开始。

Rustlings 练习

安装为你提供 rustlings 命令。 运行它并带有 --help 标志以查看有哪些选项可用。

$ rustlings --help

安装脚本还会克隆 rustlings Git 存储库,并安装运行示例程序所需的所有依赖项。 你可以在 rustlings 下的 exercises 目录中查看示例程序

$ cd rustlings
$ pwd
/home/tux/rustlings
$ ls
AUTHORS.md  Cargo.toml        CONTRIBUTING.md  info.toml install.sh README.md  target Cargo.lock  CHANGELOG.md  exercises install.ps1  LICENSE src tests
$ ls -m exercises/
advanced_errors, clippy, collections, conversions, enums, error_handling, functions, generics, if, intro, macros, mod.rs, 
modules, move_semantics, option, primitive_types, quiz1.rs, quiz2.rs, quiz3.rs, quiz4.rs, README.md, 
standard_library_types, strings, structs, tests, threads, traits, variables

从命令行列出所有练习

rustlings 命令为你提供了一个 list 命令,该命令显示每个示例程序,它的完整路径和状态(默认为 pending。)

$ rustlings list
Name         Path                                 Status
intro1       exercises/intro/intro1.rs            Pending
intro2       exercises/intro/intro2.rs            Pending
variables1   exercises/variables/variables1.rs    Pending
variables2   exercises/variables/variables2.rs    Pending
variables3   exercises/variables/variables3.rs    Pending
[...]

在输出的末尾,你将获得一个进度报告,以便你可以跟踪你的工作。

Progress: You completed 0 / 84 exercises (0.00 %).

查看示例程序

rustings list 命令显示了哪些程序可用,因此在任何时候,你都可以通过将完整路径复制到终端中作为 catless 命令的参数来查看这些程序的代码

$ cat exercises/intro/intro1.rs

验证你的程序

现在你可以开始调试程序。 你可以使用 verify 命令来做到这一点。 请注意,rustlings 选择列表中的第一个程序 (intro1.rs),尝试编译它,并且成功了

$ rustlings verify
Progress: [-----------------------------------] 0/84
✅ Successfully ran exercises/intro/intro1.rs!

You can keep working on this exercise,
or jump into the next one by removing the `I AM NOT DONE` comment:

 6 |  // Execute the command `rustlings hint intro1` for a hint.
 7 |  
 8 |  // I AM NOT DONE
 9 |

从输出中可以看到,即使示例代码可以编译,但仍有工作要做。 每个示例程序在其源文件中都有以下注释

$ grep "NOT DONE" exercises/intro/intro1.rs
// I AM NOT DONE

尽管第一个程序的编译工作正常,但除非你删除 I AM NOT DONE 注释,否则 rustlings 不会移动到下一个程序。

进入下一个练习

intro1.rs 中删除注释后,可以通过再次运行 rustlings verify 命令来转到下一个练习。 这次,你可能会注意到 rustlings 尝试编译系列中的下一个程序 (intro2.rs),但遇到了错误。 你应该调试该问题,修复它,然后继续前进。 这是一个关键步骤,可以让你了解 Rust 为什么说程序有错误。

$ rustlings verify
Progress: [>------------------------] 1/84
⚠️  Compiling of exercises/intro/intro2.rs failed! Please try again. Here's the output:
error: 1 positional argument in format string, but no arguments were given
 --> exercises/intro/intro2.rs:8:21
  |
8 |         println!("Hello {}!");
  |                         ^^

error: aborting due to previous error

获取提示

Rustlings 有一个方便的 hint 参数,它可以告诉你示例程序到底有什么问题,以及如何修复它。 你可以将其视为一个附加的帮助选项,以补充编译器错误消息告诉你的内容。

$ rustlings hint intro2
Add an argument after the format string.

根据上述提示,修复程序很容易。 你所需要做的就是在 println 语句中添加一个额外的参数。 这个 diff 应该可以帮助你理解这些变化

< println!("Hello {}!", "world");
---
> println!("Hello {}!");

在你进行更改并从源代码中删除 NOT DONE 注释后,你可以再次运行 rustlings verify 来编译和运行代码。

$ rustlings verify
Progress: [>-------------------------------------] 1/84
✅ Successfully ran exercises/intro/intro2.rs!

跟踪进度

你不会在一天内完成所有练习,而且很容易忘记你停在哪里。 你可以运行 list 命令来查看你的工作状态。

$ rustlings list
Name         Path                                  Status
intro1       exercises/intro/intro1.rs             Done   
intro2       exercises/intro/intro2.rs             Done   
variables1   exercises/variables/variables1.rs     Pending
variables2   exercises/variables/variables2.rs     Pending
variables3   exercises/variables/variables3.rs     Pending
[...]

运行特定练习

如果你不想从头开始并跳过几个练习,rustlings 允许你使用 rustlings run 命令专注于特定的练习。 这会运行一个特定的程序,而无需验证之前的课程。 例如

$ rustlings run intro2
Hello world!
✅ Successfully ran exercises/intro/intro2.rs
$ rustlings run variables1

输入练习名称可能会变得乏味,但 rustlings 为你提供了一个方便的 next 命令,因此你可以转到该系列中的下一个练习。

$ rustlings run next

替代的 watch 命令

如果你不想在每次修改后都输入 verify,你可以在终端窗口中运行 watch 命令,然后不断修改源代码以修复问题。 watch 命令会检测到这些修改,并不断重新编译程序以查看问题是否已修复。

$ rustlings watch

通过调试学习

众所周知,Rust 编译器会提供非常有意义的错误消息,这有助于你理解代码中的问题。 这通常会加快调试速度。 Rustlings 是练习 Rust、习惯阅读错误消息和理解 Rust 语言的好方法。 在 GitHub 上查看 Rustlings 5.0.0 的最新功能。

[ 通过 Rust 练习编程。 下载我们的 Rust 速查表。 ]

标签
User profile image.
经验丰富的软件工程专业人士。 主要兴趣是安全、Linux、恶意软件。 喜欢在命令行工作。 对底层软件以及理解事物的工作原理感兴趣。 这里表达的观点是我个人的观点,不代表我的雇主的观点

评论已关闭。

Creative Commons License本作品采用 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.