我正在从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)
为什么我会收到此警告?
writer您传递给的对象writeln!可以是任意std::io::Write对象,特别是文件编写器、网络编写器或其他对象。当您写入它们时,它们可能会失败,因此writeln!(...)会返回一个Result<T,E>,它指示写入操作是成功完成还是失败。
如果您不使用 this Result,那么您可能会错过发生错误的时间,因此程序的逻辑可能会失败。(请注意,Rust 没有例外,因此通常有两种方式来说明问题:在返回类型中,如Option、Result、bool或其他类型;或者通过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 次 |
| 最近记录: |