» Rust创建命令行程序grep » 2. 开发 » 2.5 添加 Lint

添加 Lint

Lint 是分析源代码并查找、报告出有关编程风格、潜在错误和编码标准等问题的工具。术语 "lint" 源自一个名为 "lint" 的 Unix 实用工具,它用于识别 C 代码中的错误和缺陷。

在 Rust 项目中项目中使用 linting 工具是一种最佳实践,它有助于保证代码质量并保持代码一致性。

Rust 生态中开发者通常使用 clippy 来进行 lint。

如果还没有安装的话,使用以下命令安装它:

rustup update
rustup component add clippy

了解更多关于 rustup 的信息:https://rustup.rs/

然后运行它:

cargo clippy

你将得到一个 lint 问题的列表:

    Checking lr_grustep v0.1.0 (.../lr_grustep)
warning: this expression creates a reference which is immediately dereferenced by the compiler
  --> src/lib.rs:61:40
   |
61 |             let result = grep(pattern, &file_path, options)?;
   |                                        ^^^^^^^^^^ help: change this to: `file_path`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
   = note: `#[warn(clippy::needless_borrow)]` on by default

warning: `filter_map()` will run forever if the iterator repeatedly produces an `Err`
  --> src/lib.rs:71:23
   |
71 |     Ok(reader.lines().filter_map(|line| line.ok()).collect())
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `map_while(Result::ok)`
   |
note: this expression returning a `std::io::Lines` may produce an infinite number of `Err` in case of a read error
  --> src/lib.rs:71:8
   |
71 |     Ok(reader.lines().filter_map(|line| line.ok()).collect())
   |        ^^^^^^^^^^^^^^
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#lines_filter_map_ok
   = note: `#[warn(clippy::lines_filter_map_ok)]` on by default

warning: `lr_grustep` (lib) generated 2 warnings (run `cargo clippy --fix --lib -p lr_grustep` to apply 1 suggestion)
    Finished dev [unoptimized + debuginfo] target(s) in 0.59s

尝试修复所有问题,然后再次运行 clippy

cargo clippy

如果没有问题出现,那就意味着你的代码现在是 "风格优良" 的。

src/lib.rs 中的更改:

@@ -58,7 +58,7 @@ pub fn grep_recursive(
         let entry = entry?;
         if entry.file_type().is_file() {
             let file_path = entry.path();
-            let result = grep(pattern, &file_path, options)?;
+            let result = grep(pattern, file_path, options)?;
             results.extend(result);
         }
     }
@@ -68,7 +68,7 @@ pub fn grep_recursive(
 fn read_file_lines(file_path: &Path) -> Result<Vec<String>, io::Error> {
     let file = fs::File::open(file_path)?;
     let reader = io::BufReader::new(file);
-    Ok(reader.lines().filter_map(|line| line.ok()).collect())
+    Ok(reader.lines().map_while(Result::ok).collect())
 }
 
 fn filter_lines(pattern: &Regex, lines: &[String], flag: bool) -> Vec<MatchItem> {
上页下页