现在你可以开始调试程序了。你可以使用命令 verify来做这件事。注意 Rustlings 选择了列表里的第一个程序(intro1.rs)并尝试去编译它,最后编译成功:
$ rustlings verifyProgress: [-----------------------------------] 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 verifyProgress: [>------------------------] 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 intro2Add an argument after the format string.
基于以上提示,修复这个程序就很简单了。你只需要在语句 println中加一个额外的参数。这个 diff 对比应该能帮你理解发生的变化:
println!("Hello {}!");
一旦你做出了修改,并从源代码中去掉了注释 NOT DONE,你可以再一次运行rustlings verify来编译并运行代码。
$ rustlings verifyProgress: [>-------------------------------------] 1/84? Successfully ran exercises/intro/intro2.rs!
如果你不想从头开始并且想要跳过一些练习,Rustlings 允许你使用命令 rustlings run来专注特定的练习。如此可以运行指定的程序而不需要验证之前的课程。例如:
$ rustlings run intro2Hello world!? Successfully ran exercises/intro/intro2.rs$ rustlings run variables1
敲入练习名字可能会变得乏味,但 Rustlings 为你准备了便利的命令 next用来移向系列中的下一个练习。
$ rustlings run next