ПрограммированиеRust разработчик

Как в Rust реализовано чтение и парсинг строк в числа (например, из String в i32)? Какие подводные камни существуют при использовании метода parse, и как корректно обрабатывать ошибки преобразования?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В Rust стандартный метод для преобразования строки в число — это метод parse(). Его можно применить к типам, реализующим трейт FromStr, например, для преобразования String или &str в i32, f64 и другие.

Пример:

let num: i32 = "42".parse().unwrap();

Однако при некорректной строке возникает ошибка (Result::Err). Важно обрабатывать результат через match, чтобы избежать краха приложения:

let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Число: {}", n), Err(e) => println!("Ошибка парсинга: {}", e), }

Метод parse поддерживает перегрузку типов через "turbofish" (::<i32>), если тип невозможно вывести неявно.

Вопрос с подвохом.

Вопрос: Можно ли вызвать .parse() без указания типа во время компиляции и получить корректный результат?

Часто отвечают: Да, если строка содержит число.

Правильный ответ: Нет, во время компиляции должен быть известен тип, в который производится преобразование. Если тип не выводим (например, не используется дальше явно), компилятор выдаст ошибку.

Пример неправильного кода:

let x = "10".parse(); // Ошибка: неясно, в какой тип парсить

Для исправления используйте turbofish:

let x = "10".parse::<i32>().unwrap();

Примеры реальных ошибок из-за незнания тонкостей темы.


История

В модуле парсинга конфига оставили .parse().unwrap() без обработки ошибки. Одна опечатка в пользовательском настройке приводила к panic! и остановке всего приложения на продакшене.


История

В одном проекте разработчики не указывали тип явно (не использовали turbofish), а переменная промежуточно не применялась, поэтому компилятор не мог вывести тип, что приводило к трудноуловимой ошибке на этапе компиляции.


История

В проекте возник баг из-за того, что для парсинга большого числа из строки случайно применили parse::<u8>, что привело к ошибке переполнения. Ошибку обнаружили только спустя несколько недель использования, когда были потеряны данные.