如何在我自己的代码中构造一个 ParseIntError?

How to construct a ParseIntError in my own code?

我想在我的函数中重用标准库的 ParseIntError。但是,我正在自己实现输入字符串的解析,因此我不需要 return 由标准库 return 编辑的错误值。

我没有找到构造 ParseIntError 值的方法。我找到的唯一解决方案如下所示:

use std::num::ParseIntError;

fn from_str_radix(s: &str, radix: u32) -> Result<(), ParseIntError> {
    let error_empty = "".parse::<i32>().expect_err("get empty input error");
    let error_invalid_digit = "Z".parse::<i32>().expect_err("get invalid digit error");

    if s.is_empty() {
        return Err(error_empty);
    }

    for c in s.chars().rev() {
        match c.to_digit(radix) {
            None => return Err(error_invalid_digit),
            _ => unimplemented!(),
        }
    }

    Ok(())
}

是否有更优雅的方式从我自己的代码 return ParseIntError

目前无法构造一个 ParseIntError yourself. As you find it, there is a open issue 并要求 public。不过,我觉得这不是什么好事。

ParseIntErrornum模块的错误。它并不是为每个将实施解析箱的人使用的,因为你应该有你自己的潜在错误。您可以使用 IntErrorKind,但我仍然认为这不是一件好事,因为您可能会因为没有相同的错误而结束。

所以,我认为您应该有自己的错误类型,并且可以使用相同的设计,具有 enum#[non_exhaustive] 属性。有很多 crates 使错误更容易产生。你应该毫不犹豫地在你自己的代码中使用你自己的错误。