From 3158ec4ebd81dbfd131cbc80790a746503c7c88b Mon Sep 17 00:00:00 2001 From: Yuhang Wu Date: Wed, 22 Jul 2026 17:55:35 +0800 Subject: [PATCH] =?UTF-8?q?refactor(part5):=20=E6=9B=BF=E6=8D=A2=E5=8E=9F?= =?UTF-8?q?=E6=9C=89=E6=9E=9A=E4=B8=BE=E7=A4=BA=E4=BE=8B=E4=B8=BAStatus?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 更新了part5的main.rs代码,移除了Direction和IpAddr枚举,改用Status枚举作为演示示例;同时补充了枚举相关练习题的参考解答代码。 --- part5/enum练习题.md | 157 ++++++++++++++++++++++++++++++++++++++++++++ part5/src/main.rs | 21 ++---- 2 files changed, 163 insertions(+), 15 deletions(-) diff --git a/part5/enum练习题.md b/part5/enum练习题.md index d93198b..1fd86c8 100644 --- a/part5/enum练习题.md +++ b/part5/enum练习题.md @@ -89,6 +89,8 @@ fn main() { } ``` +> 可以通过 + ### 题目 1-5 ```rust @@ -99,6 +101,8 @@ fn main() { } ``` +> 不能,Option枚举类型不能直接用+,需要实现add方法 + ### 题目 1-6 ```rust @@ -122,6 +126,8 @@ fn main() { } ``` +> 不能,match需要匹配所有可能出现的类型 + ### 题目 1-7 ```rust @@ -139,6 +145,8 @@ fn main() { } ``` +> 可以 + ### 题目 1-8 ```rust @@ -161,6 +169,8 @@ fn main() { } ``` +> 可以 + *** ## 二、填空题:补充代码 @@ -188,6 +198,23 @@ fn main() { } ``` +```rust +enum TrafficLight { + Red, + Yellow, + Green, +} + +fn main() { + let light = TrafficLight::Red; + match light { + TrafficLight::Red => println!("停止"), + TrafficLight::Yellow => println!("减速"), + TrafficLight::Green => println!("通行"), + } +} +``` + ### 题目 2-2:带数据的枚举 ```rust @@ -209,6 +236,21 @@ fn main() { } ``` +```rust +enum WebEvent { + PageLoad, + KeyPress(char), + Click { x: i32, y: i32 }, +} + +fn main() { + let load = WebEvent::PageLoad; + let key = WebEvent::KeyPress('a'); + let click = WebEvent::Click { x: 100, y: 200 }; + println!("ok"); +} +``` + ### 题目 2-3:Option 的使用 ```rust @@ -230,6 +272,23 @@ fn main() { } ``` +```rust +fn main() { + let v1 = Some(10); + let v2: Option = None; + + let val1 = match v1 { + Some(n) => n, + None => 0, + }; + let val2 = match v2 { + Some(n) => n, + None => 0, + }; + println!("val1: {}, val2: {}", val1, val2); +} +``` + ### 题目 2-4:Result 的使用 ```rust @@ -261,6 +320,31 @@ fn main() { } ``` +```rust +fn divide(a: i32, b: i32) -> Result { + if b == 0 { + Err(String::from("除数不能为零")) + } else { + Ok(a / b) + } +} + +fn main() { + let result1 = divide(10, 2); + let result2 = divide(10, 0); + + match result1 { + Ok(val) => println!("结果: {}", val), + Err(e) => println!("错误: {}", e), + } + + match result2 { + Ok(val) => println!("结果: {}", val), + Err(e) => println!("错误: {}", e), + } +} +``` + ### 题目 2-5:枚举上的方法 ```rust @@ -290,6 +374,32 @@ fn main() { } ``` +```rust +enum Message { + Quit, + Write(String), + Move { x: i32, y: i32 }, +} + +impl Message { + fn call(&self) { + match self { + Message::Quit => println!("退出"), + Message::Write(text) => println!("写入: {}", text), + Message::Move { x, y } => println!("移动到 ({}, {})", x, y), + } + } +} + +fn main() { + let m = Message::Write(String::from("你好世界")); + m.call(); + + let n = Message::Move { x: 10, y: 20 }; + n.call(); +} +``` + ### 题目 2-6:if let 语法 ```rust @@ -310,6 +420,16 @@ fn main() { } ``` +```rust +fn main() { + let config_max = Some(3u8); + + if let Some(max) = config_max { + println!("最大值为: {}", max); + } +} +``` + ### 题目 2-7:嵌套 Option 处理 ```rust @@ -326,6 +446,18 @@ fn main() { } ``` +```rust +fn main() { + let opt: Option> = Some(Some(42)); + + match opt { + Some(Some(inner)) => println!("值是: {}", inner), + Some(None) => println!("内层是 None"), + None => println!("外层是 None"), + } +} +``` + ### 题目 2-8:match 的多种模式 ```rust @@ -342,6 +474,18 @@ fn main() { } ``` +```rust +fn main() { + let x = 3; + + match x { + 1 | 2 => println!("是 1 或 2"), + 3..=8 => println!("在 3 到 8 之间"), + _ => println!("其他值"), + } +} +``` + *** ## 三、找出并修复错误 @@ -362,6 +506,19 @@ fn main() { } ``` +```rust +#[derive(Debug)] +enum Status { + Active, + Inactive, +} + +fn main() { + let s = Status::Active; + println!("{:?}", s); +} +``` + ### 题目 3-2 ```rust diff --git a/part5/src/main.rs b/part5/src/main.rs index 17b9d02..5b80e3c 100644 --- a/part5/src/main.rs +++ b/part5/src/main.rs @@ -1,19 +1,10 @@ #[derive(Debug)] -enum Direction { - North, - South, - East, - West, -} - -enum IpAddr { - V4(String), - V6(String), +enum Status { + Active, + Inactive, } fn main() { - let direction = Direction::North; - println!(" direction: {:?}", direction); - let home = IpAddr::V4(String::from("127.0.0.1")); - // println!(" home: {:?}", home); -} + let s = Status::Active; + println!("{:?}", s); +} \ No newline at end of file