Unwrap_or_else не работает для получения расширения из Path - PullRequest
0 голосов
/ 09 марта 2020

Я использую unwrap_or_else для обработки ошибок. Следующий код не будет компилироваться:

use std::{path::Path, process::abort};

fn example() {
    Path::new("<path>").extension().unwrap_or_else(|err| {
        println!("{} {}", "", err);
        abort();
    });
}
error[E0593]: closure is expected to take 0 arguments, but it takes 1 argument
 --> src/lib.rs:4:37
  |
4 |     Path::new("<path>").extension().unwrap_or_else(|err| {
  |                                     ^^^^^^^^^^^^^^ ----- takes 1 argument
  |                                     |
  |                                     expected closure that takes 0 arguments

Код, подобный этому, не имеет проблем:

let input_file_reader = fs::File::open("<path>").unwrap_or_else(|err| {
    println!("{} {}", "", err);
    abort();
});

Я попытался посмотреть примеры, посмотреть Path и посмотреть Общая структура замыкания, но я не мог понять, почему unwrap_or_else не будет работать только с Path::extension.

1 Ответ

1 голос
/ 09 марта 2020
pub fn open<P: AsRef<Path>>(path: P) -> Result<File>;
pub fn extension(&self) -> Option<&OsStr>;

Один возвращает Result, а другой возвращает Option. Когда расширения нет, это просто None. Нет ошибки, чтобы перейти к обратному вызову.

let input_file_reader = fs::File::open("<path>").unwrap_or_else(|| ...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...