Rust-列挙型
Rustプログラミングでは、可能なバリアントのリストから値を選択する必要がある場合、列挙データ型を使用します。列挙型は、enumキーワードを使用して宣言されます。以下は列挙型の構文です-
enum enum_name {
variant1,
variant2,
variant3
}
イラスト:列挙型の使用
この例では、列挙型-GenderCategoryを宣言しています。これには、男性と女性のバリアントがあります。プリント!マクロは列挙型の値を表示します。コンパイラは、トレイトstd :: fmt :: DebugがGenderCategoryに実装されていないというエラーをスローします。属性#[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を定義しています。フィールドの性別はタイプGenderCategory(列挙型)であり、値として男性または女性のいずれかを割り当てることができます。
// 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 }
オプション列挙型
Optionは、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)
一致ステートメントと列挙型
マッチステートメントは、列挙型に格納された値を比較するために使用することができます。次の例では、関数定義print_sizeかかり、CarTypeのパラメータとして列挙します。この関数は、パラメーター値を事前定義された定数のセットと比較し、適切なメッセージを表示します。
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
オプションと一致
オプションタイプを返す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
データ型との一致と列挙
列挙型の各バリアントにデータ型を追加することが可能です。次の例では、列挙型のNameバリアントとUsr_IDバリアントは、それぞれ文字列型と整数型です。次の例は、データ型を持つ列挙型での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