可以这样做吗?如果不是为什么?
use std::error::Error;
use std::io::{self, Read};
fn main() {
if let Err(e) = foo() {
println!("Error: {}", e);
}
}
fn foo() -> Result<(), impl Error> {
let mut buffer = String::new();
io::stdin().read_to_string(&mut buffer)?;
let _: i32 = buffer.parse()?;
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
error[E0282]: type annotations needed
--> src/main.rs:10:24
|
10 | fn foo() -> Result<(), impl Error> {
| ^^^^^^^^^^ cannot infer type for `_`
Run Code Online (Sandbox Code Playgroud)
这里有两个问题:
impl Traits
在编译时静态地解析为具体类型.在这里,您尝试返回两种实现的不同类型Error
:std::io::Error
和std::num::ParseIntError
.由于impl Trait
在编译期间必须将其解析为只有一种类型,因此无法做到这一点.
该?
运营商要求From::from
对错误类型,这意味着它是相对于目标型柔性之间的转换.这里,目标类型是a impl Trait
,因此编译器没有足够的信息来知道要选择哪种确切类型.
由于这些原因,impl Traits
这不是真正适合在这里使用的工具.您可以通过以下方式解决此问题:
Box<dyn Error>
作为返回类型.这实现From<E>
了Error
类型,因此转换将自动运行.但它需要动态分配.From<ErrType>
为每个类型实现.