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. まとめ
今回は、列挙型の基本的なことだけをやりました。他にも、タプル型や構造体型、ジェネリクスジェネリクスの列挙型を定義することもできます。それらは後々試していきたいと思います。
投稿者プロフィール
最新の投稿
- 【Remix】2024年3月23日【Remix】 環境構築手順
- 【Rust】2022年11月27日【Rust】Unsafe Rust
- 【Rust】2022年11月27日【Rust】列挙型
- 【Rust】2022年10月22日【Rust】構造体