いくつかのヴァリアントのうちからどれか一つをとるデータを表す型です。各ヴァリアントは、それぞれ自身に関連するデータを持つこともできます。(unit-like構造体のような)データを持たないヴァリアント、名前付きデータを持つヴァリアント、(タプル構造体のような)名前なしデータを持つヴァリアントがありえます。列挙型の値はどのヴァリアントにもマッチしうるのです。呼ばれることもあります。列挙型としてとりうる値の集合は、各ヴァリアントとしてとりうる値の集合の和であるためです。自体の名前によってスコープ化されています。これにより、以下のどちらもうまく動きます。いう名前ですが、列挙型の名前でスコープ化されているため、衝突することなく使うことができます。列挙型の値は、ヴァリアントに関連するデータに加え、その値自身がどのヴァリアントであるかという情報を持っています。データが、それ自身がどの型なのかを示す「タグ」をもっているためです。コンパイラはこの情報を用いて、列挙型内のデータへ安全にアクセスすることを強制します。値をどれか一つのヴァリアントであるかのようにみなして、その中身を取り出すということはできません。コンパイル時エラー}こういった操作が許されないことで制限されているように感じられるかもしれませんが、この制限は克服できます。それには二つの方法があります。式でヴァリアントのパターンマッチを行う方法です。セクションに書いてあります。関数としてのコンストラクタ列挙型のコンストラクタも、関数のように使うことができます。world".to_string());これは、以下と同じです。セクションでは関数を他の関数へ引数として渡す話をします。ベクタへ変換することができます。v.into_iter().map(Message::Write).collect();。