RozdziałyWyliczenia i dopasowanie wzorcówTypy wyliczeniowe

Typy wyliczeniowe

Definicja prostego wyliczenia

  1. Typ wyliczeniowy tworzony jest za pomocą słowa kluczowego enum:
    #[derive(Debug)]
    enum UIEvent {
        ButtonClicked,
        Scroll
    }
  2. Utworzenie wartości wyliczenia:
    fn main() {
        let clicked = UIEvent::ButtonClicked;
        let scroll = UIEvent::Scroll;
    }
  3. Jeśli chcesz używać samych nazw poszczególnych wartości typu wyliczeniowego, możesz wprowadzić je do zakresu za pomocą instrukcji use:
    use UIEvent::*;
     
    fn main() {
        let clicked = ButtonClicked;
        let scroll = Scroll;
    }
  4. Definicja metody, która operuje na wartościach typu wyliczeniowego:
    fn describe(event : UIEvent) {
        println!("{:?}", event);
    }

Atrybuty i funkcje w typach wyliczeniowych

  1. Rozszerz wcześniejszy typ wyliczeniowy o nową wartość KeyPressed, która będzie przechowywać wartość oznaczającą przycisk, który został wciśnięty:
    #[derive(Debug)]
    enum UIEvent {
        ButtonClicked,
        Scroll,
        KeyPressed(char)
    }
  2. Utwórz zdarzenie nowego typu, a następnie wypisz je za pomocą metody describe:
    // in main function
    let key_pressed = KeyPressed('b');
  3. Typy wyliczeniowe można też komponować:
    #[derive(Debug)]
    enum Direction {
        Up,
        Down
    }
     
    #[derive(Debug)]
    enum UIEvent {
        ButtonClicked,
        Scroll(Direction),
        KeyPressed(char)
    }
  4. Przenieś funkcję describe do bloku impl - funkcja ta będzie metodą typu wyliczeniowego:
    impl UIEvent {
        fn describe(&self) {
            println!("{:?}", self);
        }
    }

Więcej informacji o typach wyliczeniowych znajdziesz na stronie: https://doc.rust-lang.org/book/ch06-00-enums.html

Ćwiczenie

Zdefiniuj typ wyliczeniowy Message, tak aby możliwe było utworzenie jego instancji jak podano w funkcji main:

#[derive(Debug)]
enum Message {
    // TODO: define the different variants used below
}
 
impl Message {
    fn call(&self) {
        println!("{:?}", self);
    }
}
 
fn main() {
    let messages = [
        Message::Move { x: 10, y: 30 },
        Message::Echo(String::from("hello world")),
        Message::ChangeColor(200, 255, 255),
        Message::Quit,
    ];
 
    for message in &messages {
        message.call();
    }
}

Źródło: rustlings