Как создать ParseIntError в моем собственном коде? - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу использовать стандартную библиотеку 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 из моего собственного кода?

1 Ответ

3 голосов
/ 10 апреля 2019

В настоящее время нет способа создать ParseIntError самостоятельно.Как вы обнаружите, существует открытый issue, который просит обнародовать его.Однако я не думаю, что это хорошо.

ParseIntError - ошибка модуля num.Он не предназначен для использования всеми, кто реализует синтаксический анализатор, потому что у вас должна быть ваша собственная потенциальная ошибка.Вы могли бы использовать IntErrorKind, но я все еще не думаю, что это хорошая вещь, потому что вы могли бы закончить тем, что у вас не будет той же ошибки.

Итак, я думаю, у вас должна быть собственная ошибкатип, и, возможно, использовать тот же дизайн, имеют атрибут enum с #[non_exhaustive].Существует множество ящиков , которые упрощают создание ошибок.Не стесняйтесь использовать собственную ошибку в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...