可以这样做吗?如果不是为什么?
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(())
}
我收到此错误:
error[E0282]: type annotations needed
  --> src/main.rs:10:24
   |
10 | fn foo() -> Result<(), impl Error> {
   |                        ^^^^^^^^^^ cannot infer type for `_`
这里有两个问题:
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>为每个类型实现.| 归档时间: | 
 | 
| 查看次数: | 151 次 | 
| 最近记录: |