在Result <Option <T >>的情况下简化Rust中的错误处理

时间:2019-10-06 09:14:39

标签: rust

试想一下我有一个具有Result<Option<T>>结果的函数。

如果ResultErrOptionNone,我想返回MyError错误。

您的建议是什么?

2 个答案:

答案 0 :(得分:4)

一种解决方案是使用模式匹配:

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{})
}

答案 1 :(得分:0)

选项和结果中还有其他有用的功能可以帮助您完成此任务。

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>
}