見出し画像

Rust enum/列挙型の使い方と注意点

Rustのenum/列挙型は異なる型の値を一つの型で表現する便利な手法です。

enumは特定の限定された集合の中から1つの値を取ることができる型を定義するのに使用されます。


enumの使い方

enumの定義方法

基本的なenumの定義方法は以下の通りです。

enum Direction {
    North,
    East,
    South,
    West,
}

ここではDirectionというenumを定義し、四方向のいずれかを表すことができます。
enumの各バリアントは、それ自体が型を持つことができます。


enumにデータを持たせる

enumは単に識別子だけでなく、データも保持させることができます。

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

上記のenumでは、異なる種類のメッセージを表現しており、それぞれのバリアントが異なるデータを保持しています。


enumの利用

enumを使用する場合、match文と組み合わせるのが一般的です。
matchはenumのバリアントごとに異なる動作を指定できるため、非常に便利です。

fn process_message(msg: Message) {
    match msg {
        Message::Quit => {
            println!("Quit");
        },
        Message::Move { x, y } => {
            println!("Move to x: {}, y: {}", x, y);
        },
        Message::Write(text) => {
            println!("Text message: {}", text);
        },
        Message::ChangeColor(r, g, b) => {
            println!("Change color to Red: {}, Green: {}, Blue: {}", r, g, b);
        },
    }
}

上記のコードのprocess_message関数はMessage型の値を引数として受け取り、その値に応じて異なるアクションを実行します。
それぞれのバリアントが持つであろうデータ構造に基づいて、異なる処理をmatch文を使って分岐しています。

Quitバリアントがマッチした場合、コンソールに"Quit"と出力します。このバリアントは追加のデータを持たないため、何もパラメータを取りません。

Moveバリアントがマッチした場合、そのバリアントが持つxとyの値を使って、コンソールに"Move to x: {xの値}, y: {yの値}"と出力します。

Writeバリアントがマッチした場合、そのバリアントが持つtext(文字列)を使って、コンソールに"Text message: {textの内容}"と出力します。

ChangeColorバリアントがマッチした場合、RGB値としてそれぞれの色の値を表示することで、"Change color to Red: {rの値}, Green: {gの値}, Blue: {bの値}"と出力します。


注意点

全ての可能性を網羅する

match文を使用する場合、すべてのenumバリアントをカバーする必要があります。
一部のバリアントを扱っていない場合、コンパイラはエラーを報告します。すべてのケースを明示的に扱いたくない場合は、_(アンダースコア)を使って残りのケースをキャッチできます。


パフォーマンスの考慮

enumに大きなデータを持たせると、enumのサイズはその中で最大のデータを持つバリアントに依存するため、メモリ使用量に影響を与える可能性があります。
これを避けるためには、大きなデータはボックス(Box)を使ってヒープに格納することが推奨されます。


バリアントの使用

enumのバリアントが多くなると、コードの複雑性が増す可能性があります。
適切に抽象化や分割を行い、管理しやすいように設計することが必要です。


Rustをもっと詳しくなりたい方に

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!

個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。

Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。


基礎から学ぶRustプログラミング入門

本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この経験に学べ

この記事が気に入ったらサポートをしてみませんか?