Rust-enums

提供:Dev Guides
移動先:案内検索

Rust-列挙

Rustプログラミングでは、可能なバリアントのリストから値を選択する必要がある場合、列挙データ型を使用します。 列挙型は、_enum_キーワードを使用して宣言されます。 以下は列挙型の構文です-

enum enum_name {
   variant1,
   variant2,
   variant3
}

図:列挙の使用

この例では、男性と女性のバリアントを持つ列挙型-_GenderCategory_を宣言しています。 _print!_マクロは、列挙型の値を表示します。 コンパイラは、GenderCategory_に_trait std
fmt :: Debugが実装されていないというエラーをスローします。 属性_#[derive(Debug)] _は、このエラーを抑制するために使用されます。
//The `derive` attribute automatically creates the implementation
//required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
   Male,Female
}
fn main() {
   let male = GenderCategory::Male;
   let female = GenderCategory::Female;

   println!("{:?}",male);
   println!("{:?}",female);
}

出力

Male
Female

構造体と列挙型

次の例では、構造Personを定義しています。 フィールド_gender_はタイプ_GenderCategory_(列挙型)であり、値として_Male_または_Female_のいずれかを割り当てることができます。

//The `derive` attribute automatically creates the
implementation
//required to make this `enum` printable with
`fmt::Debug`.

#[derive(Debug)]
enum GenderCategory {
   Male,Female
}

//The `derive` attribute automatically creates the implementation
//required to make this `struct` printable with `fmt::Debug`.
#[derive(Debug)]
struct Person {
   name:String,
   gender:GenderCategory
}

fn main() {
   let p1 = Person {
      name:String::from("Mohtashim"),
      gender:GenderCategory::Male
   };
   let p2 = Person {
      name:String::from("Amy"),
      gender:GenderCategory::Female
   };
   println!("{:?}",p1);
   println!("{:?}",p2);
}

この例では、Personタイプのオブジェクト_p1_および_p2_を作成し、これらの各オブジェクトの属性、名前、および性別を初期化します。

出力

Person { name: "Mohtashim", gender: Male }
Person { name: "Amy", gender: Female }

オプション列挙

オプションは、Rust標準ライブラリの定義済み列挙型です。 この列挙型には、_Some(data)_とNoneの2つの値があります。

構文

enum Option<T> {
   Some(T),     //used to return a value
   None         //used to return null, as Rust doesn't support
   the null keyword
}

ここでは、タイプ_T_は任意のタイプの値を表します。

Rustは_null_キーワードをサポートしていません。 _enumOption_の値_None_は、関数がnull値を返すために使用できます。 返すデータがある場合、関数は_Some(data)_を返すことができます。

例でこれを理解しましょう-

プログラムは、戻り値のタイプがOptionの関数_is_even()_を定義します。 関数は、渡された値が偶数かどうかを検証します。 入力が偶数の場合、値trueが返され、そうでない場合、関数は_None_を返します。

fn main() {
   let result = is_even(3);
   println!("{:?}",result);
   println!("{:?}",is_even(30));
}
fn is_even(no:i32)->Option<bool> {
   if no%2 == 0 {
      Some(true)
   } else {
      None
   }
}

出力

None
Some(true)

一致ステートメントと列挙

_match_ステートメントを使用して、enumに格納されている値を比較できます。 次の例は、_CarType_列挙型をパラメーターとして取る関数_print_size_を定義しています。 この関数は、パラメーター値を定義済みの定数セットと比較し、適切なメッセージを表示します。

enum CarType {
   Hatch,
   Sedan,
   SUV
}
fn print_size(car:CarType) {
   match car {
      CarType::Hatch => {
         println!("Small sized car");
      },
      CarType::Sedan => {
         println!("medium sized car");
      },
      CarType::SUV =>{
         println!("Large sized Sports Utility car");
      }
   }
}
fn main(){
   print_size(CarType::SUV);
   print_size(CarType::Hatch);
   print_size(CarType::Sedan);
}

出力

Large sized Sports Utility car
Small sized car
medium sized car

オプションと一致

Option型を返す_is_even_関数の例は、以下に示すようにmatchステートメントで実装することもできます-

fn main() {
   match is_even(5) {
      Some(data) => {
         if data==true {
            println!("Even no");
         }
      },
      None => {
         println!("not even");
      }
   }
}
fn is_even(no:i32)->Option<bool> {
   if no%2 == 0 {
      Some(true)
   } else {
      None
   }
}

出力

not even

データ型との一致と列挙

列挙型の各バリアントにデータ型を追加することが可能です。 次の例では、enumのNameバリアントとUsr_IDバリアントは、それぞれString型と整数型です。 次の例は、データ型を持つ列挙でのmatchステートメントの使用を示しています。

//The `derive` attribute automatically creates the implementation
//required to make this `enum` printable with `fmt::Debug`.
#[derive(Debug)]
enum GenderCategory {
   Name(String),Usr_ID(i32)
}
fn main() {
   let p1 = GenderCategory::Name(String::from("Mohtashim"));
   let p2 = GenderCategory::Usr_ID(100);
   println!("{:?}",p1);
   println!("{:?}",p2);

   match p1 {
      GenderCategory::Name(val)=> {
         println!("{}",val);
      }
      GenderCategory::Usr_ID(val)=> {
         println!("{}",val);
      }
   }
}

出力

Name("Mohtashim")
Usr_ID(100)
Mohtashim