Try変換

? を実際に展開すると、前述のコードよりも少し複雑なコードになります。

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> を返す関数は、ErrorOuterErrorInner が同じ型であるか、ErrorOuterFrom<ErrorInner> を実装している場合にのみ、型 Result<U, ErrorInner> の値に ? を使用できます。

特に変換が 1 か所でのみ発生する場合は、From を実装する代わりに Result::map_err を使用するのが一般的です。

Optionには互換性の要件はありません。Option<T>を返す関数は、任意のT型とU型に対して、?演算子をOptionに適用できます。

Result を返す関数では Option? を使用できません。その逆も同様です。ただし、Option::ok_orOptionResult に変換でき、Result::okResultOption に変換できます。