Option
プログラムの一部が失敗した際、panic!するよりも、エラーを捕捉する方が望ましい場合があります。これはOptionという列挙型を用いることで可能になります。
列挙型Option<T>には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` の値は、他のあらゆる列挙型と同様パターンマッチに使用できます。
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`をアンラップすると中の値を取得できます。
println!("{:?} unwraps to {:?}", optional_float, optional_float.unwrap());
// `None`をアンラップしようとすると`panic!`します。
println!("{:?} unwraps to {:?}", none, none.unwrap());
}