返回Rust中的结果类型

aydmsdu9  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(130)

我对Rust还很陌生,因为我决定直接从Python跳出来挑战自己。我不知道Result的返回类型,所以我想也许在这里我会找到一些帮助。
我目前正在编写一个实现input(message)函数的程序,如下所示:

fn input(message: &str) -> io::Result<String> {
    print!("{}", message);
    io::stdout().flush()?;

    let mut user_input = String::new();
    io::stdin().read_line(&mut user_input)?;

    Ok(user_input.trim().to_owned())
}

(From代码运行良好,但我试图弄清楚如何使用std::result::Result而不是io::Result,只是因为。
我尝试将其转换为:

fn input(message: &str) -> Result<String, Error> {
/*  */
}

但是编译器让我知道问号操作符不能将其错误转换为std::fmt::Error。我只是想弄清楚如何正确地使用Result作为返回类型。我应该指定一个Err(something)返回吗?在这种情况下,我甚至不知道如何做。
我需要一个清楚的解释到底发生了什么(就像,非常清楚,这样我的猴子大脑就可以理解的东西)。

col17t5w

col17t5w1#

您可以在自定义ErrorType中合并错误:

#[derive(Debug)]
enum MyCustomError {
    ParseError(ParseIntError),
    IoError(std::io::Error),
}

impl std::error::Error for MyCustomError {}

impl fmt::Display for MyCustomError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            MyCustomError::ParseError(e) => write!(f, "Parse Error {e}"),
            MyCustomError::IoError(e) => write!(f, "Io Error {e}"),
        }
    }
}

或者你也可以使用dyn errors(阅读rustbook中的更多内容):

fn throw_dyn_error() -> Result<(), Box<dyn error::Error>> {
    //...
    Err("What happens".into())
}

在其他 * 生产就绪 * 方式中,您可以使用anyhow板条箱和thiserror板条箱

相关问题