面试题答案
一键面试fn fetch_data() -> Result<Option<i32>, String> {
// 模拟返回值
Ok(Some(42))
}
fn transform_result() -> Option<Result<i32, String>> {
match fetch_data() {
Ok(Some(data)) => Some(Ok(data)),
Ok(None) => Some(Err("Data not found".to_string())),
Err(e) => Some(Err(e)),
}
}
转换的意义
这种转换的意义在于将Result<Option<T>, E>
类型转换为Option<Result<T, E>>
类型,改变了结果的包装层次。在原类型Result<Option<T>, E>
中,Result
整体表示操作的成功或失败,Option
在成功时表示数据是否存在。而转换后的Option<Result<T, E>>
,Option
表示整个获取操作是否有意义(例如可能存在某种条件决定这个操作是否应该执行),Result
表示在有意义的操作下数据获取成功或失败。
应用场景
- 可选的条件执行:例如在一个程序中,某些数据的获取依赖于之前的其他条件判断。如果条件不满足,获取数据的操作本身就没有意义,此时
Option
可以表示操作是否应该进行,Result
表示实际获取数据时的成功或失败。 - 缓存机制:在缓存数据的场景下,如果缓存失效或者未命中,
Option
可以表示是否应该尝试从其他数据源获取数据(如数据库),如果尝试获取,Result
可以表示从其他数据源获取是否成功。