Hello everyone!
I am doing the rustlings book and came across this struct/enum exercise (it's enums3)
I promise I read the book parts 6.1 and 6.2, and this thread.
-
But yet: I've had the hardest time to get why does the Message::ChangeColor variant does not take a State.color as type?
Move takes a Point, so why would ChangeColor, who implements a color tuple, not take a color as argument? I guess my problem is that I am under the impression that those enums need to be very hierarchical and that the enum Message should not be able to access an inner field of another struct that is not even public. -
Besides the compiler that if I was going that way ( ChangeColor(State::color)), I should instead implement State as trait:
^^^^^^^^^^^ help: use fully-qualified syntax:
::color`
So it got me even more confused. What does this error message even mean?
-
(last minute edit): why doesn't the compiler complain about the missing placeholder _ for every other processing case
?
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
}
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) {
match message {
Message::ChangeColor(a,b,c) => self.change_color((a,b,c)),
Message::Quit => self.quit(),
Message::Echo(s) => self.echo(s),
Message::Move(p) => self.move_position(p),
}
}
}
#[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(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_eq!(state.quit, true);
}
}