使用map_err
和and_then
方法来消除嵌套的Result
,可以使代码更加清晰和易于理解。
例如,原来的代码可能会像这样:
fn read_file(path: &str) -> Result {
let contents = match std::fs::read_to_string(path) {
Ok(contents) => contents,
Err(err) => {
return Err(IOError::ReadError(err));
}
};
let processed_contents = match process_file_contents(&contents) {
Ok(processed_contents) => processed_contents,
Err(err) => {
return Err(IOError::ProcessError(err));
}
};
Ok(processed_contents)
}
使用map_err
和and_then
方法重写后的代码如下所示:
fn read_file(path: &str) -> Result {
std::fs::read_to_string(path)
.map_err(|err| IOError::ReadError(err))
.and_then(|contents| process_file_contents(&contents).map_err(|err| IOError::ProcessError(err)))
}
这将消除原始代码中的嵌套的Result
。