官术网_书友最值得收藏!

bt2-L 1.7 用Clippy來(lái)發(fā)現(xiàn)常見(jiàn)錯(cuò)誤

Rust提供了一個(gè)叫作Clippy的工具,可以在用戶編碼的過(guò)程中給出提示和指導(dǎo)。你隨時(shí)可以在終端里輸入cargo clippy,它會(huì)給出一份關(guān)于當(dāng)前項(xiàng)目的建議列表。Clippy給出的很多警告信息同樣會(huì)在編譯代碼時(shí)出現(xiàn)在編譯器的輸出里。大多數(shù)支持Rust的開(kāi)發(fā)環(huán)境能夠和Clippy集成,這樣就可以在編寫(xiě)代碼的過(guò)程中給出實(shí)時(shí)的警告和提示。

接下來(lái),我們演示如何用Clippy來(lái)修正一個(gè)簡(jiǎn)單的項(xiàng)目。進(jìn)入此前選定的代碼主目錄,輸入cargo new clippy來(lái)創(chuàng)建一個(gè)新的項(xiàng)目(見(jiàn)1.3.2節(jié))。編輯src/main.rs文件使其包含下列內(nèi)容:

InstallingRust/Clippy/src/main.rs

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

在終端窗口中輸入cargo run來(lái)運(yùn)行這段程序,你會(huì)看到如下的輸出(還有關(guān)于代碼的若干條警告):

這段程序可以良好運(yùn)行,但是仍然有改進(jìn)空間,因?yàn)樗鲆暳薘ust提供的一些很好用的語(yǔ)法特性以及命名規(guī)范。這都是Clippy可以幫助開(kāi)發(fā)者解決的一些常見(jiàn)問(wèn)題。只要在終端里輸入cargo clippy命令,就可以得到一個(gè)建議列表。其中的第一個(gè)警告是:

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還建議創(chuàng)建一個(gè)網(wǎng)頁(yè),以更加詳細(xì)地解釋這一警告。

第二個(gè)警告是:

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在代碼中發(fā)現(xiàn)了如下兩個(gè)問(wèn)題。

(1)代碼風(fēng)格錯(cuò)誤:Rust語(yǔ)言約定變量名應(yīng)該采用snake_case的命名方式,應(yīng)該用my_list來(lái)取代MYLIST。

(2)代碼選擇不恰當(dāng):沒(méi)有必要通過(guò)下標(biāo)來(lái)遍歷列表。Rust提供了一套迭代器機(jī)制來(lái)避免在使用索引編號(hào)時(shí)可能出現(xiàn)的錯(cuò)誤(列表很有可能會(huì)被修改,而當(dāng)列表中元素的個(gè)數(shù)發(fā)生改變時(shí),開(kāi)發(fā)者很可能會(huì)忘了去更新循環(huán)的遍歷范圍)。Clippy在幫助Rust新手發(fā)現(xiàn)了這個(gè)常見(jiàn)錯(cuò)誤的同時(shí),也給出了一些用于替換原有代碼的參考代碼。

下面我們修改一下這兩個(gè)錯(cuò)誤。

(1)用ranged-for循環(huán)來(lái)替換掉普通的for循環(huán)。Clippy的提示已經(jīng)給出了修改說(shuō)明。這個(gè)問(wèn)題的詳細(xì)內(nèi)容參見(jiàn)2.5節(jié)。

(2)用文本編輯器的查找替換功能把所有MYLIST替換為my_list。

修正后的程序如下所示,它能夠輸出和之前一樣的結(jié)果——但是Clippy檢測(cè)不到錯(cuò)誤了:

InstallingRust/ClippyFixed/src/main.rs

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

讓Clippy“吹毛求疵”

如果你覺(jué)得Clippy發(fā)現(xiàn)的錯(cuò)誤還不夠多,那么可以通過(guò)配置讓Clippy在檢查中變得更嚴(yán)格。在main.rs文件的第一行添加如下內(nèi)容:

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

猶如“吹毛求疵”一般嚴(yán)格的檢查在編寫(xiě)代碼時(shí)很有幫助——特別是想把代碼分享給別人的時(shí)候。Clippy還提供了一些更為嚴(yán)格的檢查選項(xiàng),但是在通常情況下并不建議使用。此外,一些還處于開(kāi)發(fā)階段的Clippy規(guī)則之間有時(shí)會(huì)發(fā)生沖突,它們給出的建議有時(shí)也不可靠。普通級(jí)別或“吹毛求疵”級(jí)別的檢查是經(jīng)過(guò)正確性驗(yàn)證的,這通常就是你所需要的。

請(qǐng)相信Clippy

 Clippy是一個(gè)忙碌的家伙——它是一個(gè)對(duì)所有代碼都指指點(diǎn)點(diǎn)的“專橫”的小吉祥物。筆者剛開(kāi)始使用Clippy時(shí),發(fā)現(xiàn)自己很討厭Clippy給出的建議——特別是那些建議會(huì)帶來(lái)巨大的修改工作量。但是在使用Rust工作一段時(shí)間并遵循Clippy給出的建議以后,筆者就很少再會(huì)寫(xiě)出能夠令Clippy抱怨的代碼了。Clippy是一個(gè)輔助學(xué)習(xí)的工具,可以幫助用戶避免錯(cuò)誤。

把Clippy調(diào)整到“咬文嚼字”級(jí)別是一種備受虐待的練習(xí)過(guò)程,但也的確是改進(jìn)代碼的好方法。

主站蜘蛛池模板: 沁阳市| 高唐县| 永州市| 潞西市| 邢台县| 社旗县| 轮台县| 阜平县| 巴林左旗| 邵武市| 邵武市| 兴隆县| 北票市| 精河县| 武宣县| 若尔盖县| 高要市| 平原县| 汪清县| 东至县| 方山县| 北宁市| 新竹市| 宜城市| 东港市| 临高县| 饶河县| 元谋县| 沅陵县| 昌图县| 江陵县| 敖汉旗| 田阳县| 鄂伦春自治旗| 黎平县| 奇台县| 松江区| 凉山| 伊金霍洛旗| 田林县| 祥云县|