列挙型(enum)とmatchの使い方 🧩
列挙型(enum)って何? 🤔
プログラミングをしていると、「この値は、いくつかの決まった選択肢のうちのどれか一つ」という状況によく出会います。例えば、「信号の色(赤・黄・青)」や「処理の状態(成功・失敗・処理中)」などです。
Rustでは、このような「複数の可能性の中から一つを選ぶ」型を定義するために列挙型(enum)を使います。enum
は “enumeration” の略で、「列挙する」という意味があります。
列挙型を使うと、コードがより安全で分かりやすくなります。なぜなら、想定外の値が入ることを防ぎ、その型が取りうる値を明確に示せるからです。
基本的な列挙型の定義
列挙型は enum
キーワードを使って定義します。取りうる値(ヴァリアント (variant) と呼びます)を {}
の中に列挙します。
この例では、SignalColor
という名前の列挙型を定義し、そのヴァリアントとして Red
, Yellow
, Blue
を定義しています。ヴァリアントには 列挙型名::ヴァリアント名
の形式でアクセスします。
値を持つ列挙型
Rustの列挙型は、ヴァリアントにデータを持たせることもできます。これは非常に強力な機能です 💪。データを持つ方法はいくつかあります。
タプル風ヴァリアント
ヴァリアントにタプルのようにデータを持たせることができます。
このように、ヴァリアントごとに異なる型や数のデータを持たせることができます。
match式によるパターンマッチング ✨
列挙型の値に応じて処理を分岐させたい場合、Rustでは match
式を使います。match
式は、値を取りうるパターンと比較し、一致したパターンの処理を実行します。
match
式は非常に強力で、Rustの多くの場面で使われます。特に列挙型との相性は抜群です!
match
式では、match
キーワードの後に比較したい値を書き、{}
ブロック内に パターン => 実行する式,
の形式で「アーム」を記述します。値がいずれかのアームのパターンに一致すると、対応する式が実行されます。
値を持つ列挙型とmatch
データを持つ列挙型を match
で扱う場合、パターン内でそのデータを取り出して利用できます。
パターン内で変数名を指定することで、ヴァリアントが持つデータをその変数に束縛(代入のようなもの)して、=>
の右側の式で利用できます。
Option型とmatch
Rustには「値が存在しないかもしれない」状況を表すための標準的な列挙型 Option<T>
があります。これは非常によく使われます。
Option<T>
型の値は、match
を使って安全に中身を取り出すことができます。
match
を使うことで、「値がない (None
)」場合を忘れずに処理することを強制できるため、nullポインターに起因するバグを防ぐのに役立ちます。🌟
match式の網羅性(Exhaustiveness)
Rustの match
式は網羅的 (exhaustive) である必要があります。つまり、match
で扱う値のすべての可能性をアームでカバーしなければなりません。もしパターンが足りないと、コンパイルエラーになります。🙅♀️
すべてのヴァリアントを列挙するのが大変な場合や、特定のパターン以外は同じ処理をしたい場合は、特殊なパターン _
(アンダースコア)を使うことができます。_
は「それ以外のすべての値」にマッチするワイルドカードとして機能します。
_
を使うことで、明示的に処理しない値を無視しつつ、網羅性を満たすことができます。
if let 構文
match
式は強力ですが、特定の1つのパターンにだけマッチした場合に処理を行い、それ以外は無視したい、というケースもよくあります。そのような場合、match
式は少し冗長になることがあります。
Rustには、このようなケースをより簡潔に書くための if let
構文が用意されています。
if let パターン = 値 { ... }
のように書きます。値
が パターン
にマッチした場合にのみ {}
ブロック内のコードが実行されます。match
の網羅性チェックは失われますが、特定のパターンだけを簡潔に扱いたい場合に便利です。👍
まとめ
今回はRustの列挙型(enum)と、それと密接に関連する match
式、そして if let
構文について学びました。
- 列挙型 (enum): 複数の可能性の中から一つを選ぶ型を定義する。ヴァリアントにデータを持たせることもできる。
- match式: 値をパターンと比較し、一致したアームの処理を実行する。網羅的である必要がある。
_
ワイルドカード:match
で「それ以外」のパターンを表す。- Option<T>: 値が存在しない可能性を表す標準的な列挙型。
match
で安全に扱える。 - if let: 特定のパターンにのみマッチさせたい場合に
match
より簡潔に書ける構文。
列挙型とパターンマッチングは、Rustの安全性と表現力を支える重要な機能です。ぜひ使いこなせるようになりましょう! 😊