無効な値を取ることができる便利な列挙型として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")
}
}