以调试Rust的方式来学习Rust

导读:rustlings 是由 rust 团队维护的开源项目,旨在帮助你通过调试代码的方式来学习 rust。     在我上一篇 关于 rustup 的文章 中,我向你们展示了如何安装 rust 工具链。但是,如果不能上手操作一下 rust 的话下载工具链又有什么用?学习任何语言都包括阅读现有的代码和写很多的示例程序,这是精通一门语言的好方法。然而,我们还可以走第三条路:调试代码。
通过调试来学习牵扯到尝试去编译一个已经写好的(满是漏洞的)示例程序,理解编译器生成的错误信息,修复示例代码,然后再重新编译。重复这个过程直到代码能够成功被编译并运行。
rustlings 是一个由 rust 团队维护的开源项目,旨在帮助你通过调试代码来学习 rust。它也会一路为你提供提示。如果你是一名 rust 初学者,并且刚开始阅读或已经读完了 rust 书籍,那么 rustlings 就是理想的下一步。rustllings 帮助你将运用书中所学,并转向开发更大的项目。
安装 rustlings
我使用(并推荐)fedora 电脑来体验 rustlings,但是任何 linux 发行版都可以。要安装 rustlings,你必须下载并运行它的安装脚本。通常建议你以不具备任何特别权限的普通用户(非 root 用户)来运行脚本。
记住,你需要 rust 工具链来使用 rustlings。如果你还没有这些工具链,请参考我 关于 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 仓库,并安装了运行示例程序所需的依赖。你可以在 ruslings 下的 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 从命令行列出所有练习
命令 ruslings 提供给你一个 list 命令用以展示每个示例程序,它的完整路径,以及状态 (默认为 “待定”)。
$ 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 %). 查看示例程序
命令 rustlings list 向你展示了现有的程序,所以你可以在任何时候查看这些程序的代码,你只需要将完整路径复制到你的终端作为命令 cat opensource.com 或者 less opensource.com 的参数:
$ 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.rs21   | 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 {}!); 一旦你做出了修改,并从源代码中去掉了注释 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 的最新功能吧。


基于STM32+Jlink的边界扫描实际应用演示
2018年,新造车公司将迎来产品的集体阅兵
苹果7预售启动售价5288元被猪队友曝光
实用有效!让你做好全息投影显示的几项参考设计
NEC电子推出集成了LVDS接口的超解像系统LSI
以调试Rust的方式来学习Rust
PSTN短消息终端SoC系统的软硬件设计
以TSN与5G融合技术塑造工业物联网的未来
Model Y/Mach E/Han/ID.4充电插座线束差异
照明方案公司如何才能搭上物联网的快车?
台积电认购ARM 1亿美元股份!
利用测试打造值得信赖的品牌
简述光纤衰减器的技术和应用
预测:苹果明年全年iPhone出货量为2.2亿台
日月光推出整合设计生态系统IDE
基于CCD的全自动焦度计光学图像系统设计
传统的超声波传感器采用高输出功率的块体压电陶瓷材料
紧扣6大亮点,学习亿级大卖从0到100万的操作!
存储数据恢复-硬盘故障离线导致存储崩溃的数据恢复案例
工业控制系统安全控制应用指南,为其信息安全工作提供指导