можно ли использовать ?
в функции () -> !
Нет. Оператор ?
- это выражение, где X?
интерпретируется примерно как:
match X {
Ok(success_value) => success_value,
Err(err_value) => {
return Err(err_value); // returns from the enclosing function
}
}
Обратите внимание, что выражение ?
подразумевает возврат от функции, которая его использует. Для компиляции X?
тип возвращаемой функции должен быть Result
, вариант ошибки которого совместим с вариантом ошибки X
. Функция, которая возвращает тип никогда !
, в частности обещает никогда не возвращать, поэтому ее тип возврата не совместим с return
, подразумеваемым оператором ?
.
Функция, которая никогда не возвращается, должна обрабатывать результаты ошибок, используя match
или эквивалентный, чтобы выбрать соответствующее действие, или вызывать .unwrap()
или .expect()
, чтобы преобразовать их в панику.