【Rust】Option型

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