遥かな古代、K&Rの時代のC言語には enum など無かったです。その後ANSI-C(C89)の時代に enum 導入。それで未だに enum と書くときに心に引っかかる年寄りデス。しかしRustのenumに比べるとCのenumなど「何の芸もない」ものに見えますな。Rustのenum強力。列挙型いや構造体だ、クラスだ?
※「やっつけな日常」投稿順 indexはこちら
今回参照させていただいておりますのは、いつもお世話になっております『Rust By Example 日本語版』様の以下のページと
これまたお世話になっております『The Rust Programming Language 日本語版』さまの以下のページです。
今回実験したソースコード
以下のソースでは、C言語式の列挙型、列挙されるメンバは結局のところ整数値を持つ、をOldstyleとしております。Rust式の列挙型、列挙されるメンバはいろいろな型の値をとれる、複数の値、構造体かタプルかなどいろいろとれる、をNewstyleであります。その上 Newstyleではその構造体に属するメソッドを定義できてしまうんであります。単なる「列挙」からは遠く離れている気がします。
ソースが以下に。
#[derive(Debug)] enum Oldstyle { A, B, } #[derive(Debug)] enum Newstyle { A(i32, i32), B(f32), } impl Newstyle { fn ftst(&self) -> i32 { match self { Newstyle::A(temp_a, _dummy) => { *temp_a + 1 }, Newstyle::B(temp_b) => { (*temp_b as i32) + 1 }, } } } fn main() { println!("train-enum"); println!("Oldstyle::A as i32 {}", Oldstyle::A as i32); println!("Oldstyle::B as i32 {}", Oldstyle::B as i32); println!("Oldstyle::B Debug=>{:?}", Oldstyle::B); let n_a = Newstyle::A(555, 999); let n_b = Newstyle::B(63.456); println!("Newstyle::A {:?}", n_a); println!("Newstyle::B {:?}", n_b); println!("Newstyle::ftst {}", n_a.ftst()); println!("Newstyle::ftst {}", n_b.ftst()); }
main()関数内で、新旧のenumに複数の方法でアクセスしてみています。
実機での実行結果
実機上での実行結果が以下に。
Cスタイルを使えば「伝統的」なenumの使用法も普通に書けますが、新スタイルを知ってしまうともはや後戻りが出来ない感じもいたします。ホントRustのenum強力ですな。