Typy wyliczeniowe
Definicja prostego wyliczenia
- Typ wyliczeniowy tworzony jest za pomocą słowa kluczowego
enum
:#[derive(Debug)] enum UIEvent { ButtonClicked, Scroll }
- Utworzenie wartości wyliczenia:
fn main() { let clicked = UIEvent::ButtonClicked; let scroll = UIEvent::Scroll; }
- 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; }
- Definicja metody, która operuje na wartościach typu wyliczeniowego:
fn describe(event : UIEvent) { println!("{:?}", event); }
Atrybuty i funkcje w typach wyliczeniowych
- 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) }
- Utwórz zdarzenie nowego typu, a następnie wypisz je za pomocą metody
describe
:// in main function let key_pressed = KeyPressed('b');
- Typy wyliczeniowe można też komponować:
#[derive(Debug)] enum Direction { Up, Down } #[derive(Debug)] enum UIEvent { ButtonClicked, Scroll(Direction), KeyPressed(char) }
- Przenieś funkcję
describe
do blokuimpl
- 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