添加 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> {