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'); - Typ wyliczeniowy może posiadać również nazwane atrybuty, podobnie jak struktury. Dodaj do typu wyliczeniowego
UIEventnową 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 } } - 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 }; - Typy wyliczeniowe można też komponować. Rozszerz wartość
Scrollo nową atrybutDirection, 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 } } - Przenieś funkcję
describedo blokuimpl- funkcja ta będzie metodą typu wyliczeniowego:impl UIEvent { fn describe(&self) { println!("{:?}", self); } }🤔Pytania:
- Gdzie (domyślnie) przechowywane są wartości typu wyliczeniowego?
- 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