Перетворення спроб

Ефективне розширення ? є трохи складнішим, ніж було зазначено раніше:

expression?

працює так само, як

match expression { Ok(value) => value, Err(err) => return Err(From::from(err)), }

Виклик From::from тут означає, що ми намагаємося перетворити тип помилки на тип, який повертає функція. Це дозволяє легко інкапсулювати помилки у помилки вищого рівня.

Приклад

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.

Оператор ? повинен повертати значення, сумісне з типом повернення функції. Для Result це означає, що типи помилок мають бути сумісними. Функція, яка повертає Result<T, ErrorOuter>, може використовувати ? на значенні типу Result<U, ErrorInner> тільки якщо ErrorOuter і ErrorInner мають однаковий тип або якщо ErrorOuter реалізує From<ErrorInner>.

Поширеною альтернативою реалізації From є Result::map_err, особливо коли перетворення відбувається лише в одному місці.

Для Option немає вимог щодо сумісності. Функція, що повертає Option<T>, може використовувати оператор ? на Option<U> для довільних типів T та U.

Функція, яка повертає Result, не може використовувати ? в Option і навпаки. Однак, Option::ok_or перетворює Option в Result, тоді як Result::ok перетворює Result в Option.