使用 writeln 时必须使用未使用的 `std::result::Result`

taR*_*sty 3 rust

我正在从https://rust-cli.github.io/book/tutorial/testing.html学习 rust cli 教程,但遇到了编译器警告:

unused `std::result::Result` that must be used
  --> src/main.rs:15:13
   |
15 |             writeln!(writer, "{}", line);
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

use exitfailure::ExitFailure;
use failure::ResultExt;
use structopt::StructOpt;

#[derive(StructOpt)]
struct Cli {
    pattern: String,
    #[structopt(parse(from_os_str))]
    path: std::path::PathBuf,
}

fn find_matches(content: &str, pattern: &str, mut writer: impl std::io::Write) {
    for line in content.lines() {
        if line.contains(pattern) {
            writeln!(writer, "{}", line);
        }
    }
}

#[test]
fn find_a_match() {
    let mut result = Vec::new();
    find_matches("lorem ipsum\ndolor sit amet", "lorem", &mut result);
    assert_eq!(result, b"lorem ipsum\n");
}

fn main() -> Result<(), ExitFailure> {
    let args = Cli::from_args();
    let content = std::fs::read_to_string(&args.path)
        .with_context(|_| format!("could not read file `{}`", &args.path.display()))?;
    find_matches(&content, &args.pattern, &mut std::io::stdout());
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此警告?

Ale*_*nov 9

writer您传递给的对象writeln!可以是任意std::io::Write对象,特别是文件编写器、网络编写器或其他对象。当您写入它们时,它们可能会失败,因此writeln!(...)会返回一个Result<T,E>,它指示写入操作是成功完成还是失败。

如果您不使用 this Result,那么您可能会错过发生错误的时间,因此程序的逻辑可能会失败。(请注意,Rust 没有例外,因此通常有两种方式来说明问题:在返回类型中,如OptionResultbool或其他类型;或者通过panic!assert!宏,如果出现问题,将导致程序崩溃,并且没有机会恢复错误的)。

所以理想情况下你不应该Result以任何方式忽视这一点。你现在可以这样做

for line in content.lines() {
    if line.contains(pattern) {
        if let Err(e) = writeln!(writer, "{}", line) {
            println!("Writing error: {}", e.to_string());   
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,稍后您可以对错误做出更充分的反应(例如重试写入)


归档时间:

查看次数:

3250 次

最近记录:

5 年,9 月 前