为什么我得到"未使用的结果必须使用...结果可能是一个Err变体,应该处理",即使我正在处理它?

mar*_*hon 2 rust

fn main() {
    foo().map_err(|err| println!("{:?}", err));
}

fn foo() -> Result<(), std::io::Error> {
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

结果:

warning: unused `std::result::Result` that must be used
 --> src/main.rs:2:5
  |
2 |     foo().map_err(|err| println!("{:?}", err));
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(unused_must_use)] on by default
  = note: this `Result` may be an `Err` variant, which should be handled

    Finished dev [unoptimized + debuginfo] target(s) in 0.58s
     Running `target/debug/playground`
Run Code Online (Sandbox Code Playgroud)

游乐场链接

Ben*_*ley 7

您没有处理结果,而是将结果从一种类型映射到另一种类型.

foo().map_err(|err| println!("{:?}", err));
Run Code Online (Sandbox Code Playgroud)

该行的作用是call foo(),它返回Result<(), std::io::Error>.然后map_err使用闭包返回的类型(在本例中为()),并修改错误类型并返回Result<(), ()>.这是您没有处理的结果.既然你似乎想要忽略这个结果,那么最简单的事情就是调用ok().

foo().map_err(|err| println!("{:?}", err)).ok();
Run Code Online (Sandbox Code Playgroud)

ok()转换Result<T,E>Option<T>,将错误转换为None,您将不会收到忽略的警告.

或者:

match foo() {
    Err(e) => println!("{:?}", e),
    _ => ()
}
Run Code Online (Sandbox Code Playgroud)

  • 或者[`foo().unwrap_or_else(| err | println!("{:?}",错误))`](https://doc.rust-lang.org/stable/std/result/enum.Result. HTML#method.unwrap_or_else) (5认同)