diff options
Diffstat (limited to 'exercises/08_enums')
| -rw-r--r-- | exercises/08_enums/README.md | 10 | ||||
| -rw-r--r-- | exercises/08_enums/enums1.rs | 17 | ||||
| -rw-r--r-- | exercises/08_enums/enums2.rs | 30 | ||||
| -rw-r--r-- | exercises/08_enums/enums3.rs | 73 |
4 files changed, 130 insertions, 0 deletions
diff --git a/exercises/08_enums/README.md b/exercises/08_enums/README.md new file mode 100644 index 0000000..30d4d91 --- /dev/null +++ b/exercises/08_enums/README.md @@ -0,0 +1,10 @@ +# Enums + +Rust allows you to define types called "enums" which enumerate possible values. +Enums are a feature in many languages, but their capabilities differ in each language. Rust’s enums are most similar to algebraic data types in functional languages, such as F#, OCaml, and Haskell. +Useful in combination with enums is Rust's "pattern matching" facility, which makes it easy to run different code for different values of an enumeration. + +## Further information + +- [Enums](https://doc.rust-lang.org/book/ch06-00-enums.html) +- [Pattern syntax](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html) diff --git a/exercises/08_enums/enums1.rs b/exercises/08_enums/enums1.rs new file mode 100644 index 0000000..25525b2 --- /dev/null +++ b/exercises/08_enums/enums1.rs @@ -0,0 +1,17 @@ +// enums1.rs +// +// No hints this time! ;) + +// I AM NOT DONE + +#[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); +} diff --git a/exercises/08_enums/enums2.rs b/exercises/08_enums/enums2.rs new file mode 100644 index 0000000..df93fe0 --- /dev/null +++ b/exercises/08_enums/enums2.rs @@ -0,0 +1,30 @@ +// enums2.rs +// +// Execute `rustlings hint enums2` or use the `hint` watch subcommand for a +// hint. + +// I AM NOT DONE + +#[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(); + } +} diff --git a/exercises/08_enums/enums3.rs b/exercises/08_enums/enums3.rs new file mode 100644 index 0000000..92d18c4 --- /dev/null +++ b/exercises/08_enums/enums3.rs @@ -0,0 +1,73 @@ +// enums3.rs +// +// Address all the TODOs to make the tests pass! +// +// Execute `rustlings hint enums3` or use the `hint` watch subcommand for a +// hint. + +// I AM NOT DONE + +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, + 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, p: Point) { + self.position = p; + } + + fn process(&mut self, message: Message) { + // 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: + // fn function((t, u, p, l, e)) + } +} + +#[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: "hello world".to_string(), + }; + 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); + assert_eq!(state.message, "Hello world!"); + } +} |
