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

时间:2018-11-19 04:25:34

标签: rust

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

fn foo() -> Result<(), std::io::Error> {
    Ok(())
}

结果:

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`

playground link

1 个答案:

答案 0 :(得分:6)

您不处理结果,而是将结果从一种类型映射到另一种类型。

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

该行的作用是调用foo(),它返回Result<(), std::io::Error>。然后map_err使用闭包返回的类型(在这种情况下为()),并修改错误类型并返回Result<(), ()>。这是您未处理的结果。由于您似乎只想忽略此结果,因此最简单的操作可能是调用ok()

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

ok()Result<T,E>转换为Option<T>,将错误转换为None,您不会因忽略而得到警告。

或者:

match foo() {
    Err(e) => println!("{:?}", e),
    _ => ()
}