【Rust】列挙型

1. 概要 

今回はRustの列挙型について学んでいきたいと思います。

2. 列挙型

列挙型とは、値を列挙して一つにまとめたデータ型になります。

Rustの列挙型は、代数的データ型と言うそうです。TypeScriptや関数型言語に見られるデータ構造です。

列挙型は次のように定義します。

enum 列挙型名 {
    値1,
    値2,
    ...
}

列挙型に列挙した値をvariant(ヴァリアント)といいます。構造体は、値のすべてで構成されているのに対して、列挙型はこのヴァリアントのいずれかの値をとります。

実際に列挙型を定義してみましょう。

#[derive(Debug)]
enum Coin {
    Coin = 1,
}

fn main() {
    println!("{:?}", Coin::Coin);
}

結果

   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.23s
     Running `target/debug/hello_rust`
Coin

列挙型Coinを定義して、ヴァリアントにアクセスするプログラムです。扱い方は他の言語とあまり大差ないように感じます。

列挙型も構造体を同じようにメソッドを定義できます。簡単な硬貨計算ツールを作成しながら確認してみましょう。

// 硬貨の種類を表す列挙型
enum Coin {
    Coin1(isize),
    Coin5(isize),
    Coin10(isize),
    Coin50(isize),
    Coin100(isize),
    Coin500(isize),
}
impl Coin {
    // 硬貨の種類から実際の金額を計算するメソッド
    fn calc_price(&self) -> isize {
        match *self {
            Coin::Coin1(v) => v,
            Coin::Coin5(v) => v * 5,
            Coin::Coin10(v) => v * 10,
            Coin::Coin50(v) => v * 50,
            Coin::Coin100(v) => v * 100,
            Coin::Coin500(v) => v * 500,
        }
    }
}

fn main() {
    // 硬貨の種類と枚数を指定
    let wallet: Vec<Coin> = vec![
        Coin::Coin1(3),   // 1円が3枚
        Coin::Coin5(10),  // 5円が10枚
        Coin::Coin10(5),  // 10円がが5枚
        Coin::Coin50(1),  // 50円が1枚
        Coin::Coin100(1), // 100円が1枚
        Coin::Coin500(5), // 500円が5枚
    ];
    // 金額を計算して表示
    let total = wallet.iter().fold(0, |sum, v| sum + v.calc_price());
    println!("財布の合計は{}円です", total);
}

結果

   Compiling hello_rust v0.1.0 (<作業ディレクトリ>/hello_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.76s
     Running `target/debug/hello_rust`
財布の合計は2753円です

まずは、硬貨の種類を表す列挙型を定義します。その次に、match式を使って、各硬貨ごとの計算するcalc_priceメソッドを定義します。最後に、main関数でそれぞれの硬貨の枚数をしてしてitre().foldメソッドを使用して、それぞれ計算した硬貨の合計を算出し、出力しています。

itre().foldメソッドは各値の合計値などを計算するのに便利なメソッドです。

3. まとめ

今回は、列挙型の基本的なことだけをやりました。他にも、タプル型や構造体型、ジェネリクスジェネリクスの列挙型を定義することもできます。それらは後々試していきたいと思います。

投稿者プロフィール

OkawaRyouta
最新の投稿

関連記事

  1. 【Rust】文字型、論理値型

  2. 【Rust】環境構築と、Hello World!

  3. 【Rust】文字列型

  4. 【Rust】整数型、浮動小数点型

  5. 【Rust】借用と参照、ライフタイム

  6. 【Rust】Unsafe Rust

最近の記事

  1. AWS
  2. AWS
  3. AWS
  4. AWS
  5. AWS
  6. AWS
  7. AWS
  8. AWS

制作実績一覧

  1. Checkeys