Rust中Error可转换时,Result类型转换的最惯用方式是什么?
Rust错误转换的惯用写法:从Result<Foo, Error1>转Result<Foo, Error2>
有没有第三种更惯用的方式?
你提到的两种写法之外,有一个更简洁的变体,但本质和第一种逻辑一致:
fn f1() -> Result<Foo, Error2> { f2().map_err(Into::into) }
这只是利用方法引用简化了map_err的闭包写法,没有引入新逻辑。除此之外,Rust社区没有其他更主流的惯用写法。
优先选择哪一种?
优先使用第二种Ok(f2()?)的写法,理由如下:
- 写法更简洁,契合Rust中
?操作符的设计初衷——只要目标错误类型实现了From<Error1>,就能自动完成错误类型转换 - 可读性更强,一眼就能理解是调用
f2后处理错误,再将成功结果包装成Ok返回,逻辑清晰直白
关于f2().into()的问题
你说得没错,f2().into()确实无法直接生效。因为标准库并没有为Result<T, E2>实现通用的From<Result<T, E1>>(哪怕E2: From<E1>),只有当T也实现了对应转换逻辑时才会存在这个From实现,所以这种写法在你的场景下不可行。
内容的提问来源于stack exchange,提问作者Ricola
相关产品推荐
相关产品推荐

