Почему я получаю «неиспользованный результат, который должен быть использован ... Результатом может быть вариант с ошибкой, который должен быть обработан», даже если я обрабатываю его? - PullRequest
0 голосов
/ 19 ноября 2018
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`

ссылка на игровую площадку

1 Ответ

0 голосов
/ 19 ноября 2018

Вы не обрабатываете результат, вы отображаете результат из одного типа в другой.

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),
    _ => ()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...