rust学习第5章

rust学习第5章

本文字数:858  阅读时长:2分钟

访客数:加载中... | 阅读量:加载中...

枚举与模式匹配

  1. 类 C 枚举

    rust
    enum Color {
        Red,      // 类似常量
        Green,
        Blue,
    }
    
    let c = Color::Red;  // 使用时要带 ::
    
  2. 带数据的枚举

    rust
    enum 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"));
  3. 带泛型的枚举

    rust
    enum 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 = 自定义类型,和 i32Stringstruct 完全平等

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++ switchdefault可以放在任何位置(但通常放最后)
C++ if-elseelse捕获前面所有条件都不满足的情况
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 模式 = 值 → “如果值能匹配这个模式,就执行并绑定变量”