【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】借用と参照、ライフタイム

  3. 【Rust】文字列型

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

  5. 【Rust】構造体

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

最近の記事

  1. Node.js
  2. AWS
  3. AWS

制作実績一覧

  1. Checkeys