我想写这样的东西,但由于类型之间的不匹配而无法编译:
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
在每个闭包中添加 a 看起来很慢并且“锅炉板”,所以我将其替换为以下内容:
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
并始终使用?
操作员吗?
如果没有,有没有办法让结果组合器像?
运算符一样平滑?