enums3 solution

This commit is contained in:
mo8it 2024-06-21 23:18:25 +02:00
parent 020711fa97
commit 2901d85662
3 changed files with 87 additions and 14 deletions

View file

@ -1,7 +1,5 @@
// Address all the TODOs to make the tests pass!
enum Message { enum Message {
// TODO: implement the message variant types based on their usage below // TODO: Implement the message variant types based on their usage below.
} }
struct Point { struct Point {
@ -26,17 +24,17 @@ impl State {
} }
fn echo(&mut self, s: String) { fn echo(&mut self, s: String) {
self.message = s self.message = s;
} }
fn move_position(&mut self, p: Point) { fn move_position(&mut self, point: Point) {
self.position = p; self.position = point;
} }
fn process(&mut self, message: Message) { fn process(&mut self, message: Message) {
// TODO: create a match expression to process the different message variants // TODO: Create a match expression to process the different message variants.
// Remember: When passing a tuple as a function argument, you'll need extra parentheses: // Remember: When passing a tuple as a function argument, you'll need extra parentheses:
// fn function((t, u, p, l, e)) // e.g. `foo((t, u, p, l, e))`
} }
} }
@ -54,8 +52,9 @@ mod tests {
quit: false, quit: false,
position: Point { x: 0, y: 0 }, position: Point { x: 0, y: 0 },
color: (0, 0, 0), color: (0, 0, 0),
message: "hello world".to_string(), message: String::from("hello world"),
}; };
state.process(Message::ChangeColor(255, 0, 255)); state.process(Message::ChangeColor(255, 0, 255));
state.process(Message::Echo(String::from("Hello world!"))); state.process(Message::Echo(String::from("Hello world!")));
state.process(Message::Move(Point { x: 10, y: 15 })); state.process(Message::Move(Point { x: 10, y: 15 }));
@ -64,7 +63,7 @@ mod tests {
assert_eq!(state.color, (255, 0, 255)); assert_eq!(state.color, (255, 0, 255));
assert_eq!(state.position.x, 10); assert_eq!(state.position.x, 10);
assert_eq!(state.position.y, 15); assert_eq!(state.position.y, 15);
assert_eq!(state.quit, true); assert!(state.quit);
assert_eq!(state.message, "Hello world!"); assert_eq!(state.message, "Hello world!");
} }
} }

View file

@ -457,12 +457,12 @@ such as no data, anonymous structs, a single string, tuples, etc."""
name = "enums3" name = "enums3"
dir = "08_enums" dir = "08_enums"
hint = """ hint = """
As a first step, you can define enums to compile this code without errors. As a first step, define enums to compile the code without errors.
And then create a match expression in `process()`. Then, create a match expression in `process()`.
Note that you need to deconstruct some message variants in the match expression Note that you need to deconstruct some message variants in the match expression
to get value in the variant.""" to get the variant's values."""
# STRINGS # STRINGS

View file

@ -1 +1,75 @@
// Solutions will be available before the stable release. Thank you for testing the beta version 🥰 enum Message {
ChangeColor(u8, u8, u8),
Echo(String),
Move(Point),
Quit,
}
struct Point {
x: u8,
y: u8,
}
struct State {
color: (u8, u8, u8),
position: Point,
quit: bool,
message: String,
}
impl State {
fn change_color(&mut self, color: (u8, u8, u8)) {
self.color = color;
}
fn quit(&mut self) {
self.quit = true;
}
fn echo(&mut self, s: String) {
self.message = s;
}
fn move_position(&mut self, point: Point) {
self.position = point;
}
fn process(&mut self, message: Message) {
match message {
Message::ChangeColor(r, g, b) => self.change_color((r, g, b)),
Message::Echo(s) => self.echo(s),
Message::Move(point) => self.move_position(point),
Message::Quit => self.quit(),
}
}
}
fn main() {
// You can optionally experiment here.
}
#[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),
message: String::from("hello world"),
};
state.process(Message::ChangeColor(255, 0, 255));
state.process(Message::Echo(String::from("Hello world!")));
state.process(Message::Move(Point { 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!(state.quit);
assert_eq!(state.message, "Hello world!");
}
}