列挙型
列挙型(enum
)はいくつかの異なる要素型の中から1つを選ぶような場合に使用します。構造体(struct
)の定義を満たすものならば何でもenum
の要素型として使用できます。
// Create an `enum` to classify a web event. Note how both // names and type information together specify the variant: // `PageLoad != PageUnload` and `KeyPress(char) != Paste(String)`. // Each is different and independent. // `enum`を作成してwebイベントを分類する。 // 名前と型情報を併せたものが要素型になっていることに注意。 // `PageLoad != PageUnload` であり、 // `KeyPress(char) != Paste(String)` である。 // 要素型は互いに異なり、互いに非依存である。 enum WebEvent { // An `enum` variant may either be `unit-like`, // `enum`要素型はユニット風でもよい PageLoad, PageUnload, // like tuple structs, // タプル風でもよい KeyPress(char), Paste(String), // or c-like structures. // C言語スタイルの構造体風でもよい Click { x: i64, y: i64 }, } // A function which takes a `WebEvent` enum as an argument and // returns nothing. // 引数として`WebEvent`列挙型をとり、何も返さない関数 fn inspect(event: WebEvent) { match event { WebEvent::PageLoad => println!("page loaded"), WebEvent::PageUnload => println!("page unloaded"), // Destructure `c` from inside the `enum` variant. WebEvent::KeyPress(c) => println!("pressed '{}'.", c), WebEvent::Paste(s) => println!("pasted \"{}\".", s), // Destructure `Click` into `x` and `y`. WebEvent::Click { x, y } => { println!("clicked at x={}, y={}.", x, y); }, } } fn main() { let pressed = WebEvent::KeyPress('x'); // `to_owned()` creates an owned `String` from a string slice. // `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, } // Creates a type alias // 型エイリアスを作成する type Operations = VeryVerboseEnumOfThingsToDoWithNumbers; fn main() { // We can refer to each variant via its alias, not its long and inconvenient // name. // 長くて不便な列挙型の名前ではなく、別名を使って要素型を参照できる 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を読んでください。
参照
マッチ(match
), 関数(fn
), 文字列(String
), "Type alias enum variants" RFC