Rust предоставляет удобные стандартные средства для преобразования строк в числа через трейт FromStr. Наиболее часто используется метод .parse::<T>(), который можно вызвать на строках и срезах.
Во многих языках преобразование строки в число — это привычная задача, но в Rust она делается максимально безопасно и прозрачно, ошибки обработки являются частью контракта стандартной библиотеки, а не исключениями времени выполнения.
.parse::<T>() возвращает результат типа Result<T, ParseIntError> (или аналогичный для других типов), что вынуждает явно обрабатывать неудачи. Частая ошибка — игнорировать возможность ошибки, использовать unwrap() без анализа, что грозит падением программы при некорректном вводе данных, а не корректным сообщением об ошибке.
Для преобразования строк используют метод parse. Его сигнатура:
let num: i32 = "42".parse().unwrap();
Но правильнее — обрабатывать ошибку:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("Получено число: {}", n), Err(e) => println!("Ошибка парсинга: {e}"), }
Ключевые особенности:
FromStr, но точные ограничения неявны: пробелы, знаки, переполнение учитываются по-разномуResult, а не через панику или исключениеFromStr (включая пользовательские) может быть целью .parse()Можно ли использовать parse без указания типа результата?
Нет, без уточнения типа (или неявного вывода типа) Rust выдаст ошибку, потому что не понимает, в какой тип преобразовывать.
Что произойдет, если попытаться спарсить строку с нецифровым содержимым в число?
Метод вернет ошибку (Err(...)), не вызовет панику. Ошибка реализует трейт Debug, что удобно для вывода.
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
Можно ли использовать unwrap после parse, если уверены в содержимом?
Технически можно, но это анти-паттерн. Если строка неожиданно невалидна, программа аварийно завершится.
unwrap() без обработки ошибокtrim перед преобразованием, если ввод от пользователяparse::<String>()) вместо целевого числового типаКонсольная утилита читает число от пользователя и использует .parse().unwrap(). При случайном неверном вводе программа внезапно падает, пользователь не понимает причину.
Плюсы:
Минусы:
Ввод вначале очищается от пробелов, а parse используется в сценарии с match или если нужно — map_err для возвращения своей ошибки. Ошибки обрабатываются корректно, выдаётся отчётливое сообщение об ошибке.
Плюсы:
Минусы: