有什么方法可以更简洁地表达以下代码?该函数仅在结果为Ok()
时才能继续,否则应返回默认对象。我想出的代码看起来很简单,所以我想知道是否有更好,更简洁的方法。
fn get_config() -> Config {
let cfg = match get_config_file_path() { // can return a (custom) PathError
Ok(c) => c,
Err(e) => {
error(&*format!(
"{} -> Using default configuration",
e.description
));
return Config::default();
}
};
let cfg_str = match fs::read_to_string(&cfg) { // io::Error
Ok(c) => c,
Err(_) => {
error("Failed to read config file");
return Config::default();
}
};
toml::from_str(&*cfg_str).unwrap_or_else(|_| { // toml::de::Error
error("Failed to parse config file");
Config::default()
})
}
编辑:我的解决方案:
我创建了以下宏:
macro_rules! unwrap_or_return {
( $e:expr, $c:expr) => {
match $e {
Ok(x) => x,
Err(_) => return $c,
}
};
}
fn get_config() -> Config {
let cfg = unwrap_or_return!(get_config_file_path(), {
error("Failed to get path to configuration file");
Config::default()
});
let cfg_str = unwrap_or_return!(fs::read_to_string(&cfg), {
error("Failed to read config file");
Config::default()
});
toml::from_str(&*cfg_str).unwrap_or_else(|_| {
error("Failed to parse config file");
Config::default()
})
}