無効な値を取ることができる便利な列挙型としてOption型がある。
enum Option<T>{ Some(T), None, }
まず列挙型について
C++の列挙型
#include <stdio.h> enum week { Mon, Tue, Wed, Thu, Fri, Sat, Sun, }; int main(void) { enum week wk0, wk1, wk2; wk0 = Mon; wk1 = Tue; wk2 = Thu; printf("Monの値は:%d\n", wk0); printf("Tueの値は:%d\n", wk1); printf("Thuの値は:%d\n", wk2); }
#[derive(Debug)] enum Week { Mon, Tue, Wed, Thu, Fri, Sat, Sun } fn main(){ let wk0 = Week::Mon; let wk1 = Week::Tue; let wk2 = Week::Thu; println!("Monの値は{:?}", wk0); println!("Tueの値は{:?}", wk1); println!("Wedの値は{:?}", wk2); }
$ ./main
Monの値はMon
Tueの値はTue
Wedの値はThu
rustだと、c++のように0,1,2…ではなく、値がそのまま出てくる。
### Option
取得できないかもしれない値を表現する列挙型
値が無いことを示すNoneと、あることを示すSome(T)のどちらかを取る
pub enum Option<T> { None, Some(T), }
fn get_value_bad(v: bool, result: &mut usize) -> bool { if v { *result = 100; true } else { false } } fn get_value_good(v: bool) -> Option<usize> { if v { Some(100) } else { None } } fn main(){ let mut result = 0; if get_value_bad(true, &mut result){ println!("success: {}", result); } else { println!("failure"); } match get_value_good(true){ Some(result) => println!("success: {}", result), None => println!("failure") } }