Перечисления
Кратко
базовый синтаксис
// базовое объявление enum IpAddrKind { V4, V6, } // базовое использование let four = IpAddrKind::V4; let six = IpAddrKind::V6; // можно использовать в struct struct IpAddr { kind: IpAddrKind, address: String, } // может содержать разные типы, включая struct enum IpAddr { V4(u8, u8, u8, u8), V6(String), } let home = IpAddr::V4(127, 0, 0, 1); let loopback = IpAddr::V6(String::from("::1")); struct Ipv4Addr { // --snip-- } struct Ipv6Addr { // --snip-- } enum IpAddr { V4(Ipv4Addr), V6(Ipv6Addr), } enum Message { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32), } // как и struct, поддерживает impl impl Message { fn call(&self) { // method body would be defined here } }в сочетании с match
match должен покрывать все возможные значения перечисления
если перечислять все возможные значения не нужно, можно использовать другую переменную или подчёркивание
типы возвращаемых значений в match должны совпадать
учтите, что match тоже вызывает move
другие способы использования match описаны в других главах
#[derive(Debug)] enum UsState { Alabama, Alaska, // --snip-- } #[derive(Debug)] enum Coin { Penny, Nickel, Dime, Quarter(UsState), } fn value_in_cents(coin: Coin) -> u8 { match coin { Coin::Penny => 1, // если одна строка, {} можно опустить Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter(state) => { // здесь значение может быть UsState::Alabama или UsState::Alaska println!("State quarter from {:?}!", state); 25 } }; match coin { Coin::Penny => 1, // можно использовать другую переменную для остальных случаев a => { println!("{:?}", a); 5 }, }; match coin { Coin::Penny => 1, // можно использовать подчёркивание _ => 5, } }в сочетании с if let
let mut count = 0; // вариант через match match coin { Coin::Quarter(state) => println!("State quarter from {:?}!", state), _ => count += 1, } // вариант через if let if let Coin::Quarter(state) = coin { println!("State quarter from {:?}!", state); } else { count += 1; }