我想在我的函数中重用标准库的ParseIntError
。但是,我自己正在实现输入字符串的解析,所以我不需要返回标准库返回的错误值。
我没有找到构建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(())
}
是否有更优雅的方式从我自己的代码返回ParseIntError
?
目前没有办法自己构建一个ParseIntError
。正如你所发现的那样,有一个开放的issue
要求公开。但是,我认为这不是一件好事。
ParseIntError
是num
模块的错误。每个人都不会使用它来实现解析包,因为你应该有自己的潜在错误。你可以使用IntErrorKind
,但我仍然认为这不是一件好事,因为你可能因为没有同样的错误而结束。
所以,我认为你应该有自己的错误类型,也许使用相同的设计,有一个enum
与#[non_exhaustive]
属性。有很多crates使错误更容易创建。您应该毫不犹豫地在自己的代码中使用自己的错误。