やっつけな日常(38) Rustに入ればRustに従え、強力過ぎる?Rustのenum

Joseph Halfmoon

遥かな古代、K&Rの時代のC言語には enum など無かったです。その後ANSI-C(C89)の時代に enum 導入。それで未だに enum と書くときに心に引っかかる年寄りデス。しかしRustのenumに比べるとCのenumなど「何の芸もない」ものに見えますな。Rustのenum強力。列挙型いや構造体だ、クラスだ?

今回参照させていただいておりますのは、いつもお世話になっております『Rust By Example 日本語版』様の以下のページと

C言語ライクな列挙型

これまたお世話になっております『The Rust Programming Language 日本語版』さまの以下のページです。

Enumを定義する

今回実験したソースコード

以下のソースでは、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に複数の方法でアクセスしてみています。

実機での実行結果

実機上での実行結果が以下に。

RestEnumResults

Cスタイルを使えば「伝統的」なenumの使用法も普通に書けますが、新スタイルを知ってしまうともはや後戻りが出来ない感じもいたします。ホントRustのenum強力ですな。

やっつけな日常(37) Rustに入ればRustに従え、唐突に Box って何よ? へ戻る

やっつけな日常(39) RustにいればRustni従え、Rust再インストール後動作確認 へ進む