用于多个错误处理的impl trait

Fre*_*ios 4 rust

可以这样做吗?如果不是为什么?

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)

int*_*jay 8

这里有两个问题:

  1. impl Traits在编译时静态地解析为具体类型.在这里,您尝试返回两种实现的不同类型Error:std::io::Errorstd::num::ParseIntError.由于impl Trait在编译期间必须将其解析为只有一种类型,因此无法做到这一点.

  2. ?运营商要求From::from对错误类型,这意味着它是相对于目标型柔性之间的转换.这里,目标类型是a impl Trait,因此编译器没有足够的信息来知道要选择哪种确切类型.

由于这些原因,impl Traits这不是真正适合在这里使用的工具.您可以通过以下方式解决此问题:

  • 使用Box<dyn Error>作为返回类型.这实现From<E>Error类型,因此转换将自动运行.但它需要动态分配.
  • 实现一个新的错误类型作为枚举,它可以包含函数返回的任何错误类型,并From<ErrType>为每个类型实现.