プログラミング言語Rust 6章 メモ
6.1 Enumの定義
型が自由(!)、メソッドを定義できる(!)
enum Message {
Quit,
Move { x: i32, y: i32}, // 匿名構造体
Write(String), // String
ChangeColor(i32, i32, i32) // タプル
}
impl Message {
fn call(&self){
// これが可能
}
}
Option列挙体
- RustではNullは存在しない。代わりにOption型を導入している
- Option型は何か値があるかないかどちらであるかを示す。
- Option<T>とTは別物として扱われる。例えば下記のような演算をしたければ、Option<T>からTへ変換する必要がある。その変換時にはかならずOption<T>の変数がNoneではないかチェックするコードを書く羽目になり、したがってNoneがTと演算されることを避けることができる。
let x = 5; let y = Some(9); let sum = x + y;
6.2 Enumとパターンマッチ
- Enumでのパターンマッチはアームで表現する(switch - case)
#[derive(Debug)] enum UsState { Alabama, Alaska, } enum Coin { Penny, Nickel, Dime, Quater(UsState), } fn value_in_cents(coin: Coin) -> u32 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter(state) => { println!("State quater from {:?}", state); 25 }, } }
- match句を使う場合、網羅しないケースがあるとコンパイルエラーになる
- default値を表したいときはアンダースコア “_” を使う
6.3 if letでの簡潔な記法
- つまりアンダースコアを使わないやり方
let some_u8_value = Some(0u8); if let Some(3) = some_u8_value { println!("three"); }
この書き方をすると3以外の時は何もしなくなり、
_ => (),
と書くのと同じになる。