【发布时间】:2021-07-26 10:28:49
【问题描述】:
我想写这样的东西,但由于类型不匹配而无法编译:
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
let val = std::env::args()
.nth(1)
.ok_or("1 arg is expected")
.and_then(std::fs::File::open)
.and_then(serde_yaml::from_reader)?;
}
因为在每个闭包中添加 map_err 看起来很慢并且“锅炉板”,所以我将其替换为:
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
let val = serde_yaml::from_reader(std::fs::File::open(
std::env::args().nth(1).ok_or("1 arg is expected")?,
)?)?;
}
第一个感觉更自然,读起来像英语,而第二个感觉有点倒退。
我应该放弃and_then 并始终使用? 运算符吗?
如果没有,有没有办法让结果组合器像 ? 运算符一样平滑?
【问题讨论】:
-
您可以随时将其拆分为多个
let val语句:let val = env::args().nth (1).ok_or ("…")?; let val = File::open (val)?; let val = serde_yaml::from_reader (val)?;
标签: error-handling rust rust-result