Упрощение обработки ошибок в Rust, в случае Result - PullRequest
0 голосов
/ 06 октября 2019

Только представьте, что у меня есть функция с Result<Option<T>> результатом.

Если Result равно Err или Option равно None, я хочу вернуть MyError error.

Что вы предлагаете?

Ответы [ 2 ]

4 голосов
/ 06 октября 2019

Решением является использование сопоставления с образцом:

fn my_fun() -> Result<T, MyError> {
    if let Ok(Some(thing)) = other_fun() {
         Ok(thing)
    } else {
         Err(MyError{})
    }
}

или

fn my_fun() -> Result<T, MyError> {
    match other_fun() {
        Ok(Some(thing)) => Ok(thing),
        _ => Err(MyError{}),
    }
}

Если ваша ошибка реализует From<TheOtherError>, что, вероятно, является хорошей идеей, вы также можете сделать

fn my_fun() -> Result<T, MyError> {
    other_fun()?.ok_or(MyError{})
}
0 голосов
/ 08 октября 2019

Есть также другие полезные функции в Option и Result, которые помогут вам сделать это.

fn other_function() -> Result<Option<T>, OtherErr> {
   ...
}

fn call_other() -> Result<T, MyError> {
    other_function()
        // starting with a Result<Option<T>, OtherErr>
        .map_err(|other_err|  make MyError from other_err)
        // now it's a Result<Option<T>, MyError>
        .and_then(|opt_t| opt_t.ok_or_else(|| make MyError for None))
        // now it's a Result<T, MyError>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...