Last active
October 26, 2022 20:47
-
-
Save Coutlaw/89dd16a5f7eb852c4ee44a3094bcdc09 to your computer and use it in GitHub Desktop.
Rustlings: Enums 1, 2 & 3 solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Enums 1 problem (doesn't compile) | |
#[derive(Debug)] | |
enum Message { | |
// TODO: define a few types of messages as used below | |
} | |
fn main() { | |
println!("{:?}", Message::Quit); | |
println!("{:?}", Message::Echo); | |
println!("{:?}", Message::Move); | |
println!("{:?}", Message::ChangeColor); | |
} | |
// Enums 1 solution, add enum types | |
#[derive(Debug)] | |
enum Message { | |
// TODO: define a few types of messages as used below | |
Quit, | |
Echo, | |
Move, | |
ChangeColor | |
} | |
fn main() { | |
println!("{:?}", Message::Quit); | |
println!("{:?}", Message::Echo); | |
println!("{:?}", Message::Move); | |
println!("{:?}", Message::ChangeColor); | |
} | |
// Enums 2 problem (doesn't compile) | |
#[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(); | |
} | |
} | |
// Enums 2 solution, enum types with defined type properties | |
#[derive(Debug)] | |
enum Message { | |
// TODO: define the different variants used below | |
Move{x: i32, y: i32}, // object struct | |
Echo(String), // String type | |
ChangeColor(i32, i32, i32), // tuple struct | |
Quit // no defined type | |
} | |
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(); | |
} | |
} | |
// Enums 3 problem (doesn't compile) | |
enum Message { | |
// TODO: implement the message variant types based on their usage below | |
} | |
struct Point { | |
x: u8, | |
y: u8 | |
} | |
struct State { | |
color: (u8, u8, u8), | |
position: Point, | |
quit: bool | |
} | |
impl State { | |
fn change_color(&mut self, color: (u8, u8, u8)) { | |
self.color = color; | |
} | |
fn quit(&mut self) { | |
self.quit = true; | |
} | |
fn echo(&self, s: String) { | |
println!("{}", s); | |
} | |
fn move_position(&mut self, p: Point) { | |
self.position = p; | |
} | |
fn process(&mut self, message: Message) { | |
// TODO: create a match expression to process the different message variants | |
} | |
} | |
#[cfg(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn test_match_message_call() { | |
let mut state = State{ | |
quit: false, | |
position: Point{ x: 0, y: 0 }, | |
color: (0, 0, 0) | |
}; | |
state.process(Message::ChangeColor(255, 0, 255)); | |
state.process(Message::Echo(String::from("hello world"))); | |
state.process(Message::Move{ x: 10, y: 15 }); | |
state.process(Message::Quit); | |
assert_eq!(state.color, (255, 0, 255)); | |
assert_eq!(state.position.x, 10); | |
assert_eq!(state.position.y, 15); | |
assert_eq!(state.quit, true); | |
} | |
} | |
// Enums 3 solution, implement enum types, and match experssion for struct impl | |
enum Message { | |
// TODO: implement the message variant types based on their usage below | |
ChangeColor(u8, u8, u8), | |
Echo(String), | |
Move{x: u8, y: u8}, | |
Quit | |
} | |
struct Point { | |
x: u8, | |
y: u8 | |
} | |
struct State { | |
color: (u8, u8, u8), | |
position: Point, | |
quit: bool | |
} | |
impl State { | |
fn change_color(&mut self, color: (u8, u8, u8)) { | |
self.color = color; | |
} | |
fn quit(&mut self) { | |
self.quit = true; | |
} | |
fn echo(&self, s: String) { | |
println!("{}", s); | |
} | |
fn move_position(&mut self, p: Point) { | |
self.position = p; | |
} | |
fn process(&mut self, message: Message) { | |
// TODO: create a match expression to process the different message variants | |
match message { | |
Message::ChangeColor(r, g, b) => self.change_color((r, g, b)), | |
Message::Echo(s) => self.echo(s), | |
Message::Move{x, y} => self.move_position(Point{x, y}), | |
Message::Quit => self.quit() | |
} | |
} | |
} | |
#[cfg(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn test_match_message_call() { | |
let mut state = State{ | |
quit: false, | |
position: Point{ x: 0, y: 0 }, | |
color: (0, 0, 0) | |
}; | |
state.process(Message::ChangeColor(255, 0, 255)); | |
state.process(Message::Echo(String::from("hello world"))); | |
state.process(Message::Move{ x: 10, y: 15 }); | |
state.process(Message::Quit); | |
assert_eq!(state.color, (255, 0, 255)); | |
assert_eq!(state.position.x, 10); | |
assert_eq!(state.position.y, 15); | |
assert_eq!(state.quit, true); | |
} | |
} |
enum Message {
// TODO: implement the message variant types based on their usage below
ChangeColor((u8, u8, u8)),
Echo(String),
Move(Point),
Quit,
}
Instead of passing the r, g, b values separately like you two above I used one variable "result"
fn process(&mut self, message: Message) {
// TODO: create a match expression to process the different message variants
match message {
Message::ChangeColor(result) => self.change_color(result),
Message::Echo(result) => self.echo(result),
Message::Move(result) => self.move_position(result),
Message::Quit => self.quit(),
}
}
Thanks for your solutions, they helped me a lot 👍
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
enum Message {
Move(Point),
Echo(String),
ChangeColor((u8, u8, u8)),
Quit,
}
struct Point {
x: u8,
y: u8,
}
struct State {
color: (u8, u8, u8),
position: Point,
quit: bool,
}
impl State {
fn change_color(&mut self, color: (u8, u8, u8)) {
self.color = color;
}
}
#[cfg(test)]
mod tests {
use super::*;
}