Оператор ? в Rust
Внутри функции, которая сама возвращает
Result того же вида, после команды
с неудачным исходом можно поставить знак
вопроса. Тогда при удаче значение попадает
в переменную, а при сбое выполнение функции
сразу заканчивается и наружу уходит тот
же неудачный вариант.
Тип сбоя в заголовке функции должен совпадать с типом, который отдает команда после знака вопроса. Пример с разбором текста в целое:
fn parse_one() -> Result<i32, std::num::ParseIntError> {
let n: i32 = "12".parse()?;
Ok(n)
}
fn main() {
match parse_one() {
Ok(v) => println!("{}", v),
Err(e) => println!("{}", e),
}
}
На экране 12. Без знака вопроса
пришлось бы вручную разбирать промежуточный
Result и возвращать сбой отдельной
командой. Знак вопроса сокращает такой
фрагмент, но работает только когда тип
ошибки в заголовке совпадает с типом
ошибки команды.
Разные типы ошибок через знак вопроса не смешивают. Если заголовок обещает строку сбоя, а команда отдает другой тип ошибки, сборка остановится:
fn broken() -> Result<i32, String> {
let n: i32 = "12".parse()?;
Ok(n)
}
Дан следующий код:
fn read_digit() -> Result<i32, std::num::ParseIntError> {
let n: i32 = "7".parse();
Ok(n)
}
Допишите знак вопроса у разбора текста, чтобы сбой сразу уходил из функции.
Дан следующий код:
fn to_num() -> Result<i32, std::num::ParseIntError> {
let n: i32 = "0".parse()?;
Ok(n)
}
В main разберите результат
to_num и выведите число или
текст ошибки разбора.
Скажите, соберется ли функция, если в
заголовке Result<i32, String>, а
после разбора текста стоит знак вопроса
без смены типа сбоя.