Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsPmErQs 314 of 373 menu
◀ ▶

Оператор ? в 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>, а после разбора текста стоит знак вопроса без смены типа сбоя.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить