Option
プログラムの一部の失敗を panic! の呼び出しではなく捕捉したい場合があります。これは Option enum を使用することで実現できます。
Option<T> enum には 2 つのバリアントがあります。
None。失敗または値がないことを示します。Some(value)。型Tのvalueをラップするタプル構造体です。
// `panic!` しない整数除算 fn checked_division(dividend: i32, divisor: i32) -> Option<i32> { if divisor == 0 { // 失敗は `None` バリアントとして表されます None } else { // 結果は `Some` バリアントでラップされます Some(dividend / divisor) } } // この関数は成功しない可能性がある除算を処理します fn try_division(dividend: i32, divisor: i32) { // `Option` 値は、他の enum と同様にパターンマッチできます match checked_division(dividend, divisor) { None => println!("{} / {} failed!", dividend, divisor), Some(quotient) => { println!("{} / {} = {}", dividend, divisor, quotient) }, } } fn main() { try_division(4, 2); try_division(1, 0); // `None` を変数に束縛するには型注釈が必要です let none: Option<i32> = None; let _equivalent_none = None::<i32>; let optional_float = Some(0f32); // `Some` バリアントを unwrap すると、ラップされた値が取り出されます。 println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap()); // `None` バリアントを unwrap すると `panic!` します println!("{:?} unwraps to {:?}", none, none.unwrap()); }