试想一下我有一个具有Result<Option<T>>
结果的函数。
如果Result
是Err
或Option
是None
,我想返回MyError
错误。
您的建议是什么?
答案 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>
}