列挙型
列挙型(enum
)はいくつかの異なる要素型の中から1つを選ぶような場合に使用します。構造体(struct
)の定義を満たすものならば何でもenum
の要素型として使用できます。
// `enum`を作成してwebイベントを分類します。 // 名前と型情報を併せたものが要素型になっていることに注意。 // `PageLoad != PageUnload`、 // `KeyPress(char) != Paste(String)`です。 // 要素型は互いに異なり、互いに非依存です。 enum WebEvent { // `enum`要素型はユニット風でも構いません。 PageLoad, PageUnload, // タプル構造体風 KeyPress(char), Paste(String), // C言語スタイルの構造体風 Click { x: i64, y: i64 }, } // 引数として`WebEvent`列挙型をとり、何も返さない関数 fn inspect(event: WebEvent) { match event { WebEvent::PageLoad => println!("page loaded"), WebEvent::PageUnload => println!("page unloaded"), // `enum`の要素型から`c`をデストラクトします。 WebEvent::KeyPress(c) => println!("pressed '{}'.", c), WebEvent::Paste(s) => println!("pasted \"{}\".", s), // `Click`を`x`と`y`にデストラクトします。 WebEvent::Click { x, y } => { println!("clicked at x={}, y={}.", x, y); }, } } fn main() { let pressed = WebEvent::KeyPress('x'); // `to_owned()`は文字列スライスから所有権のある`String`を作成します。 let pasted = WebEvent::Paste("my text".to_owned()); let click = WebEvent::Click { x: 20, y: 80 }; let load = WebEvent::PageLoad; let unload = WebEvent::PageUnload; inspect(pressed); inspect(pasted); inspect(click); inspect(load); inspect(unload); }
型エイリアス
型エイリアスを用いると、列挙型の要素型を別名で参照できます。これは列挙型の名前があまりに長かったり、あまりに一般的だったりで改名したい場合に役立ちます。
enum VeryVerboseEnumOfThingsToDoWithNumbers { Add, Subtract, } // 型エイリアスを作成します。 type Operations = VeryVerboseEnumOfThingsToDoWithNumbers; fn main() { // 長くて不便な列挙型の名前ではなく、別名を使って要素型を参照できます。 let x = Operations::Add; }
このやり方がもっともよく見られるのは、impl
ブロックでSelf
という別名を使用する場合です。
enum VeryVerboseEnumOfThingsToDoWithNumbers { Add, Subtract, } impl VeryVerboseEnumOfThingsToDoWithNumbers { fn run(&self, x: i32, y: i32) -> i32 { match self { Self::Add => x + y, Self::Subtract => x - y, } } }
列挙型や型エイリアスについて詳しく学びたい人は、この機能が安定してRustに取り込まれたときのstabilization reportを読んでください。