Оператор ?
Оператор ? (вопросительный знак) - это удобный механизм для обработки ошибок типа Result. Он работает следующим образом: если результат выражения равен Ok(value), оператор возвращает значение value и выполнение продолжается. Если результат равен Err(e), оператор немедленно возвращает ошибку e из текущей функции. Оператор можно применять только внутри функций, которые возвращают Result (или Option).
Синтаксис
expression?
Пример
Давайте рассмотрим пример, где оператор ? упрощает обработку ошибки при парсинге числа:
fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError>
{
let num = s.parse::<i32>()?;
Ok(num)
}
fn main()
{
let res = parse_number("12345");
println!("{:?}", res);
}
Результат выполнения кода:
Ok(12345)
Пример
Если строка не может быть преобразована в число, оператор ? вернёт ошибку из функции:
fn parse_number(s: &str) -> Result<i32, std::num::ParseIntError>
{
let num = s.parse::<i32>()?;
Ok(num)
}
fn main()
{
let res = parse_number("abcde");
println!("{:?}", res);
}
Результат выполнения кода:
Err(ParseIntError { kind: InvalidDigit })
Пример
Оператор ? также работает с Option. В этом случае None возвращается из функции:
fn get_first_char(s: &str) -> Option<char>
{
let first = s.chars().next()?;
Some(first)
}
fn main()
{
let res = get_first_char("abcde");
println!("{:?}", res);
}
Результат выполнения кода:
Some('a')