Rust
Beginner
1 min read
Custom Enums with Data and Methods
Example
#[derive(Debug, Clone)]
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColour(u8, u8, u8),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => "quit".to_string(),
Message::Move { x, y } => format!("move to ({x}, {y})"),
Message::Write(text) => format!("write: {text}"),
Message::ChangeColour(r, g, b) => format!("colour: rgb({r},{g},{b})"),
}
}
fn is_quit(&self) -> bool {
matches!(self, Message::Quit)
}
}
// State machine example
#[derive(Debug)]
enum TrafficLight {
Red,
Yellow,
Green,
}
impl TrafficLight {
fn next(self) -> Self {
match self {
TrafficLight::Red => TrafficLight::Green,
TrafficLight::Green => TrafficLight::Yellow,
TrafficLight::Yellow => TrafficLight::Red,
}
}
fn duration_secs(&self) -> u32 {
match self { TrafficLight::Red => 60, TrafficLight::Green => 45, TrafficLight::Yellow => 5 }
}
}
fn main() {
let messages = vec![
Message::Move { x: 10, y: 20 },
Message::Write(String::from("hello")),
Message::ChangeColour(255, 0, 128),
Message::Quit,
];
for m in &messages {
println!("{}", m.describe());
}
println!("last is quit: {}", messages.last().unwrap().is_quit());
let mut light = TrafficLight::Red;
for _ in 0..4 {
println!("{:?} — {}s", light, light.duration_secs());
light = light.next();
}
}