如何在我自己的代码中构造一个 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。不过,我觉得这不是什么好事。
ParseIntError
是num
模块的错误。它并不是为每个将实施解析箱的人使用的,因为你应该有你自己的潜在错误。您可以使用 IntErrorKind
,但我仍然认为这不是一件好事,因为您可能会因为没有相同的错误而结束。
所以,我认为您应该有自己的错误类型,并且可以使用相同的设计,具有 enum
和 #[non_exhaustive]
属性。有很多 crates 使错误更容易产生。你应该毫不犹豫地在你自己的代码中使用你自己的错误。
我想在我的函数中重用标准库的 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。不过,我觉得这不是什么好事。
ParseIntError
是num
模块的错误。它并不是为每个将实施解析箱的人使用的,因为你应该有你自己的潜在错误。您可以使用 IntErrorKind
,但我仍然认为这不是一件好事,因为您可能会因为没有相同的错误而结束。
所以,我认为您应该有自己的错误类型,并且可以使用相同的设计,具有 enum
和 #[non_exhaustive]
属性。有很多 crates 使错误更容易产生。你应该毫不犹豫地在你自己的代码中使用你自己的错误。