枚举与模式匹配
类 C 枚举
rustenum Color { Red, // 类似常量 Green, Blue, } let c = Color::Red; // 使用时要带 ::带数据的枚举
rustenum Message { Quit, // 无数据 Move { x: i32, y: i32 }, // 匿名结构体 Write(String), // 单个值 ChangeColor(u8, u8, u8), // 多个值 } // 使用 let msg1 = Message::Quit; let msg2 = Message::Move { x: 10, y: 20 }; let msg3 = Message::Write(String::from("hello"));带泛型的枚举
rustenum Option<T> { None, // 没有值 Some(T), // 有值,类型为 T } enum Result<T, E> { Ok(T), // 成功,携带 T Err(E), // 失败,携带 E } // 使用 let maybe: Option<i32> = Some(5); let maybe: Option<i32> = None; let result: Result<i32, String> = Ok(42); let result: Result<i32, String> = Err("出错了".to_string());enum= 自定义类型,和i32、String、struct完全平等
Option 枚举
RUST里没有NULL值
Option
是类似于null的概念 并且在标准库中存在 Option
和T是不同的类型 若想使用Option
中的T 必须把它转化为T 因此也就避免了类似于C#中下面这种情况
我不会C#string a = null;
string b = a + “12345”;
控制流运算符 - match
类似于升级版的switch
用法
rust
let result = match number
{
1 => "one",
2 => "two",
3 => "three",
};高级用法
!_类似于default和else
| 语言/结构 | 通配符/默认分支 | 特点 |
|---|---|---|
Rust match | _ | 必须放在最后,匹配所有剩余情况 |
C++ switch | default | 可以放在任何位置(但通常放最后) |
C++ if-else | else | 捕获前面所有条件都不满足的情况 |
rust
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
match msg {
Message::Quit => println!("退出"),
Message::Move { x, y } => println!("移动到 ({}, {})", x, y), // 解构结构体
Message::Write(text) => println!("文本: {}", text), // 绑定变量
}
rust
match age {
n if n < 0 => println!("无效年龄"),
n if n < 18 => println!("未成年"),
n if n < 60 => println!("成年人"),
_ => println!("老年人"),
}
rust
match score {
90..=100 => 'A', // 包含100
80..=89 => 'B',
_ => 'F',
}if let
对于
rust
fn main()
{
let v = Some(0u8);
match v {
Some(3) => println!("three"),
_ => println!("others"),
}
}可以使用 if let替换
rust
fn main()
{
let v = Some(0U8);
if let Some(3) = v{
println!("three");
}
else println!("others");
}- 好处
- 处理只关心一种匹配而忽略其他匹配情况
- 更少的代码 缩进 模板代码
- 坏处
- 放弃了穷举的可能性
类似于match的语法糖
if let 模式 = 值 → “如果值能匹配这个模式,就执行并绑定变量”
- 本文链接: https://sharkoff-blog.top/posts/5.%E6%9E%9A%E4%B8%BE%E4%B8%8E%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。

