Rust游戏开发实战
上QQ阅读APP看书,第一时间看更新

bt2-L 1.7 用Clippy来发现常见错误

Rust提供了一个叫作Clippy的工具,可以在用户编码的过程中给出提示和指导。你随时可以在终端里输入cargo clippy,它会给出一份关于当前项目的建议列表。Clippy给出的很多警告信息同样会在编译代码时出现在编译器的输出里。大多数支持Rust的开发环境能够和Clippy集成,这样就可以在编写代码的过程中给出实时的警告和提示。

接下来,我们演示如何用Clippy来修正一个简单的项目。进入此前选定的代码主目录,输入cargo new clippy来创建一个新的项目(见1.3.2节)。编辑src/main.rs文件使其包含下列内容:

InstallingRust/Clippy/src/main.rs

fn main() {
let MYLIST = [ "One", "Two", "Three" ];
for i in 0..3 {
          println!("{}", MYLIST[i]);
     }
}

在终端窗口中输入cargo run来运行这段程序,你会看到如下的输出(还有关于代码的若干条警告):

这段程序可以良好运行,但是仍然有改进空间,因为它忽视了Rust提供的一些很好用的语法特性以及命名规范。这都是Clippy可以帮助开发者解决的一些常见问题。只要在终端里输入cargo clippy命令,就可以得到一个建议列表。其中的第一个警告是:

Checking clippy v0.1.0 (C:\Pragmatic\Book\code\InstallingRust\Clippy)
warning: the loop variable `i` is only used to index `MYLIST`.
--> src\main.rs:3:14
  |
3 |     for i in 0..3 {
  |              ^^^^
  |
= note: `#[warn(clippy::needless_range_loop)]` on by default

Clippy还建议创建一个网页,以更加详细地解释这一警告。

第二个警告是:

warning: variable `MYLIST` should have a snake case name
  --> src\main.rs:2:9
  | 
2 |       let MYLIST = [ "One", "Two", "Three" ]; 
  |           ^^^^^^ help: convert the identifier to snake case: `mylist` 
= note: `#[warn(non_snake_case)]` on by default

Clippy在代码中发现了如下两个问题。

(1)代码风格错误:Rust语言约定变量名应该采用snake_case的命名方式,应该用my_list来取代MYLIST。

(2)代码选择不恰当:没有必要通过下标来遍历列表。Rust提供了一套迭代器机制来避免在使用索引编号时可能出现的错误(列表很有可能会被修改,而当列表中元素的个数发生改变时,开发者很可能会忘了去更新循环的遍历范围)。Clippy在帮助Rust新手发现了这个常见错误的同时,也给出了一些用于替换原有代码的参考代码。

下面我们修改一下这两个错误。

(1)用ranged-for循环来替换掉普通的for循环。Clippy的提示已经给出了修改说明。这个问题的详细内容参见2.5节。

(2)用文本编辑器的查找替换功能把所有MYLIST替换为my_list。

修正后的程序如下所示,它能够输出和之前一样的结果——但是Clippy检测不到错误了:

InstallingRust/ClippyFixed/src/main.rs

fn main() {
let my_list = [ "One", "Two", "Three" ];
for num in &my_list {
          println!("{}", num);
     }
}

让Clippy“吹毛求疵”

如果你觉得Clippy发现的错误还不够多,那么可以通过配置让Clippy在检查中变得更严格。在main.rs文件的第一行添加如下内容:

#![warn(clippy::all, clippy::pedantic)]

犹如“吹毛求疵”一般严格的检查在编写代码时很有帮助——特别是想把代码分享给别人的时候。Clippy还提供了一些更为严格的检查选项,但是在通常情况下并不建议使用。此外,一些还处于开发阶段的Clippy规则之间有时会发生冲突,它们给出的建议有时也不可靠。普通级别或“吹毛求疵”级别的检查是经过正确性验证的,这通常就是你所需要的。

请相信Clippy

 Clippy是一个忙碌的家伙——它是一个对所有代码都指指点点的“专横”的小吉祥物。笔者刚开始使用Clippy时,发现自己很讨厌Clippy给出的建议——特别是那些建议会带来巨大的修改工作量。但是在使用Rust工作一段时间并遵循Clippy给出的建议以后,笔者就很少再会写出能够令Clippy抱怨的代码了。Clippy是一个辅助学习的工具,可以帮助用户避免错误。

把Clippy调整到“咬文嚼字”级别是一种备受虐待的练习过程,但也的确是改进代码的好方法。