【问题标题】:How to return a Result<T, ParseIntError>?如何返回 Result<T, ParseIntError>?
【发布时间】:2023-01-09 03:48:57
【问题描述】:

我想要一个函数接收对输入的引用,如果输入有效则返回一个值,如果输入无效则返回一个错误。这是我的尝试,但出现错误:

use std::num::ParseIntError;

fn get_fourth(input: &Vec<i32>) -> Result<i32, ParseIntError> {
    let q = match input.get(4) {
        Some(v) => v,
        _ => return Err(ParseIntError {kind: ParseIntError} )
    };
    Ok(*q)
}

fn main() {
    let my_vec = vec![9, 0, 10];
    let fourth = get_fourth(&my_vec);
}
error[E0423]: expected value, found struct `ParseIntError`
 --> src/main.rs:6:46
  |
6 |         _ => return Err(ParseIntError {kind: ParseIntError} )
  |                                              ^^^^^^^^^^^^^
  |
help: use struct literal syntax instead
  |
6 |         _ => return Err(ParseIntError {kind: ParseIntError { kind: val }} )
  |                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~

ParseIntError 只是临时用于我的测试。如何返回错误?我该如何解决这个问题?

【问题讨论】:

    标签: rust error-handling vec


    【解决方案1】:

    你返回一个错误就好了,你对 ParseIntError 的使用搞砸了。您不能自己构造 ParseIntError 的实例,因为它的字段是私有的,并且没有公共构造函数。

    ParseIntError 只是临时用于我的测试。

    好吧,继续制造你自己的非临时错误,你会看到你的代码的其余部分工作:

    struct LengthError;
    
    fn get_fourth(input: &Vec<i32>) -> Result<i32, LengthError> {
        let q = match input.get(4) {
            Some(v) => v,
            _ => return Err(LengthError)
        };
        Ok(*q)
    }
    

    【讨论】:

    • 哦!我知道了。关于struct LengthError;。我们只能使用struct,而不是enum,对吧!
    • @curlywei 不知道你是怎么理解的根据我的回答,enum 可以用作错误就好了。我只是提供了最简单的虚拟类型作为错误使用。
    • 好的!我解决了我的问题。 std::num::ParseFloatError 好像采用了这个方案。 (类似于你的回答)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多