В 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>, что привело к ошибке переполнения. Ошибку обнаружили только спустя несколько недель использования, когда были потеряны данные.