【rCore OS 开源操作系统】Rust 训练题题解: Enums
择要
rCore OS 开源操作系统训练营学习中的代码训练部分。
在此记录下自己学习过程中的产物,以便于日后更有“收获感”。
后续还会继续完成其他章节的训练题题解。
正文
enums1
题目
- // 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);
- }
复制代码 题解
目测就是基本的枚举值语法。
甚至简朴到题目中出现了 No hints this time! ;),不会做那就有点汗颜了。
参考资料:https://doc.rust-lang.org/stable/book/ch06-01-defining-an-enum.html
- // enums1.rs
- //
- // No hints this time! ;)
- #[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);
- }
复制代码 enums2
这里的焦点知识点是,枚举与数据类型关联。
题目
- // 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();
- }
- }
复制代码 题解
题解与上面一样。
- // enums2.rs
- //
- // Execute `rustlings hint enums2` or use the `hint` watch subcommand for a
- // hint.
- #[derive(Debug)]
- enum Message {
- // TODO: define the different variants used below
- Move { x: i32, y: i32 },
- Echo(String),
- ChangeColor(i32, i32, i32),
- Quit,
- }
- 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();
- }
- }
复制代码 enums3
题目
- // 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");
- }
- }
复制代码 题解
在要求会用枚举的基础上,联合了常常共同枚举一起使用的模式匹配。
- // enums3.rs
- //
- // Address all the TODOs to make the tests pass!
- //
- // Execute `rustlings hint enums3` or use the `hint` watch subcommand for a
- // hint.
- enum Message {
- // TODO: implement the message variant types based on their usage below
- 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, 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))
- match message {
- Message::ChangeColor(r, g, b) => self.change_color((r, g, b)),
- Message::Echo(string) => self.echo(string),
- Message::Move(point) => self.move_position(point),
- 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),
- 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");
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |