Skip to Content
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. Typ wyliczeniowy może posiadać również nazwane atrybuty, podobnie jak struktury. Dodaj do typu wyliczeniowego UIEvent nową wartość MouseClicked, która będzie przechowywać współrzędne kliknięcia:
    #[derive(Debug)] enum UIEvent { ButtonClicked, Scroll, KeyPressed(char), MouseClicked { x: i32, y: i32 } }
  4. Utwórz zdarzenie nowego typu, a następnie wypisz je za pomocą metody describe:
    // in main function let mouse_clicked = MouseClicked { x: 10, y: 20 };
  5. Typy wyliczeniowe można też komponować. Rozszerz wartość Scroll o nową atrybut Direction, która będzie przechowywać kierunek przewijania:
    #[derive(Debug)] enum Direction { Up, Down } #[derive(Debug)] enum UIEvent { ButtonClicked, Scroll(Direction), KeyPressed(char), MouseClicked { x: i32, y: i32 } }
  6. Przenieś funkcję describe do bloku impl - funkcja ta będzie metodą typu wyliczeniowego:
    impl UIEvent { fn describe(&self) { println!("{:?}", self); } }
    🤔

    Pytania:

    1. Gdzie (domyślnie) przechowywane są wartości typu wyliczeniowego?
    2. W jaki sposob w pamięci przechowywany jest typ wyliczeniowy?

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

Last updated on