Rustのenumは高機能なunionという話が前回で、それとは別に、C/C++のenumのような使い方もできる。
// Rust の enum は、C言語のenumのように特定の値を持つ定数のみを取れる型を定義するように使用できる。 // ただし、指定できるのは整数のみで、f32やstring等は不可 enum AsciiCode{ AsciiA = 65, AsciiB = 66, AsciiC = 67, } fn main() { // cu を定義。入れられるのはAsciiA,B,Cのいずれかのみ let mut cu:AsciiCode = AsciiCode::AsciiA; cu = AsciiCode::AsciiB; // この場合もパターンマッチで比較する if let AsciiCode::AsciiA=cu{ println!("AsciiA is used." ); } else{ println!("Not A." ); } // 数値を取り出すときは as をつける println!("cu is {}",cu as i32); }
なお、変数同士を比較するには、==を使うが、デフォルトでは実装されていないので、PartialEqを指定する。
// 変数同士を比較するときは、==を使うためにPartialEqを指定 #[derive(PartialEq)] enum AsciiCode{ AsciiA = 65, AsciiB = 66, AsciiC = 67, } fn main() { // cu を定義。入れられるのはAsciiA,B,Cのいずれかのみ let cu:AsciiCode = AsciiCode::AsciiA; let rs:AsciiCode=AsciiCode::AsciiB; // == で比較できる if rs == cu{ println!("same"); } else{ println!("not same"); } }
注意点として、この記法 enum TYPE{ NAME= 65, } で指定できるのは整数のみで、f32などは入れられない。どうもこの表記自体はenumの本来の使い方としてはややずれているようで、Cなどのほかの言語との歩調を合わせるのがこの表記法が可能な主な理由だという(話があった)。
なお、数値を指定しなくても使える。as i32すれば整数にもなるが、あまりこれを前提としたコードを書くべきとは思えない。
// 型も値も指定しないバリアントを持てる。 // ==を使うためにPartialEqを指定 // as i32をするとmoveされてしまうのでCopyも指定。CopyのためにCloneも指定。 #[derive(Copy,Clone,PartialEq)] enum AsciiCode{ AsciiA, AsciiB, AsciiC, } fn main() { println!("A as int {}",AsciiCode::AsciiA as i32); println!("B as int {}",AsciiCode::AsciiB as i32); println!("C as int {}",AsciiCode::AsciiC as i32); // cu,rs を定義。入れられるのはAsciiA,B,Cのいずれかのみ let cu:AsciiCode = AsciiCode::AsciiA; let rs:AsciiCode = AsciiCode::AsciiB; // == で比較した例 if rs == cu{ println!("same"); } else{ println!("not same {} vs {}",cu as i32,rs as i32); } }