当前位置: 首页 > 科技观察

以调试Rust的方式学习Rust

时间:2023-03-13 11:57:28 科技观察

在我上一篇关于Rustup的文章中,我向您展示了如何安装Rust工具链。但是,如果您不能亲手使用Rust,那么下载工具链有什么用呢?学习任何语言都需要阅读现有代码和编写大量示例程序,这是精通一门语言的好方法。但是,我们可以采用第三种方式:调试代码。通过调试学习包括尝试编译编写好的(有错误的)示例程序,了解编译器生成的错误消息,修复示例代码,然后重新编译。重复这个过程,直到代码可以成功编译运行。Rustlings是由Rust团队维护的一个开源项目,旨在帮助您通过调试代码来学习Rust。它还会在整个过程中为您提供提示。如果您是Rust初学者并且刚刚开始或已经读完Rust书籍,那么Rustlings是理想的下一步。Rustlings可帮助您将书中学到的知识应用到更大的项目中。安装Rustlings我使用(并推荐)Fedora计算机来体验Rustlings,但任何Linux发行版都可以。要安装Rustlings,您必须下载并运行其安装脚本。通常建议您以没有任何特殊权限的普通用户(而非root)身份运行脚本。请记住,您需要Rust工具链才能使用Rustlings。如果您还没有这些工具链,请参阅我关于Rustup的文章。准备就绪后,下载此安装脚本:$curl-Lhttps://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh>rustlings_install.sh再次使用shell脚本,ASCII文本可执行文件阅读脚本以查看它将执行的操作:$lessrustlings_install.sh然后运行安装:$bashrustlings_install.sh[...]Installing/home/tux/.cargo/bin/rustlingsInstalledpackage`rustlingsv4.8.0(/home/tux/rustlings)`(可执行的`rustlings`)全部完成!运行rustlings开始。Rustlings练习您现在可以使用命令rustlings。使用标志--help执行以查看可用选项。$rustlings--help此安装脚本还克隆RustlingsGit存储库并安装运行示例程序所需的依赖项。您可以在ruslings下的exercises目录中找到这些示例程序。$cdrustlings$pwd/home/tux/rustlings$lsAUTHORS.mdCargo.tomlCONTRIBUTING.mdinfo.tomlinstall.shREADME.mdtargetCargo.lockCHANGELOG.mdexercisesinstall.ps1LICENSEsrctests$ls-mexercises/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为您提供了一个列表命令来显示每个示例程序、其完整路径和状态(默认为“待定”).$rustlingslistNamePathStatusintro1exercises/intro/intro1.rsPendingintro2exercises/intro/intro2.rsPendingvariables1exercises/variables/variables1.rsPendingvariables2exercises/variables/variables2.rsPendingvariables3exercises/variables/variables[...结束时显示,您将有一个进度报告来跟踪进度。进度:您完成了0/84次练习(0.00%)。查看示例程序命令rustlingslist显示你现有的程序,所以你可以随时查看这些程序的代码,你只需要将完整路径复制到你的终端作为命令cat或less的参数:$catexercises/intro/intro1.rs验证你的程序现在你可以开始调试程序了。您可以使用命令验证来执行此操作。请注意,Rustlings选择列表中的第一个程序(intro1.rs)并尝试编译它,编译成功:$rustlingsverifyProgress:[-----------------------------------]0/84?成功运行exercises/intro/intro1.rs!您可以继续进行此练习,或通过删除“我还没有完成”评论跳到下一个练习:6|//执行命令`rustlingshintintro1`以获得提示。7|8|//我还没有完成9|从结果可以看出,示例代码虽然编译成功了,但是你还需要做一些工作。每个示例程序的源文件都带有以下注释:$grep"NOTDONE"exercises/intro/intro1.rs//IAMNOTDONE到下一个程序。进入下一个练习从intro1.rs中删除这些注释后,您可以通过再次运行命令rustlingsverify继续下一个练习。这一次,您会发现Rustlings试图编译本系列的下一个程序(intro2.rs),但遇到错误。您应该调试并修复此问题,然后继续。这是您理解为什么Rust说该程序易受攻击的关键一步。$rustlingsverifyProgress:[>------------------------]1/84??exercises/intro/intro2.rs编译失败!请再试一次。这是输出:错误:格式字符串中的1个位置参数,但未给出任何参数-->exercises/intro/intro2.rs:8:21|8|println!("你好{}!");|^^error:abortingduetopreviouserror指出Rustlings有一个非常有用的提示参数,这个参数会告诉你示例程序中出了什么问题,以及如何修复它。您可以将其视为基于编译错误消息的附加帮助选项。$rustlingshintintro2在格式字符串后添加一个参数。根据以上提示,修复这个程序是微不足道的。你只需要在语句println中添加一个额外的参数。这个差异比较应该可以帮助您了解发生了什么变化:println!("你好{}!");完成更改并从源代码中删除注释NOTDONE后,您可以再次运行rustlingsverify以编译并运行代码。$rustlingsverifyProgress:[>------------------------------------]1/84?成功运行练习/介绍/intro2.rs!跟踪您的进度您无法在一天内完成所有练习,而且忘记您到达哪里的情况并不少见。您可以执行命令列表来检查您的运动状态。$rustlingslistName路径状态intro1exercises/intro/intro1.rsDoneintro2exercises/intro/intro2.rsDonevariables1exercises/variables/variables1.rsPendingvariables2exercises/variables/variables2.rsPendingvariables3exercises/variables/variables[3.rs.]运行特定练习如果您不想从头开始并想跳过一些练习,Rustlings允许您使用命令rustlingsrun专注于特定练习。这允许您运行指定的程序而无需验证以前的课程。例如:$rustlingsrunintro2Helloworld!?成功运行exercises/intro/intro2.rs$rustlingsrunvariables1输入练习名称可能会很乏味,但Rustlings有一个方便的命令,可以让您转到本系列的下一个练习。$rustlingsrunnextinsteadofcommandwatch如果你不想在每次修改后都输入verify,可以在继续修改源代码之前在终端窗口中运行命令watch来解决问题。命令watch检测这些修改并重新编译以查看问题是否已解决。$rustlingswatch以调试和学习Rust编译器提供非常有意义的错误消息而闻名,这些消息将帮助您理解代码中的问题。这通常意味着更快的调试。Rustlings是练习Rust、学习阅读错误消息和理解Rust语言的绝佳方式。在GitHub上查看Rustlings5??.0.0的最新功能。下载Rust备忘单