rust 学习 match专项

rust 复制代码
fn main() {
	let x = 8;  // 定义 x
    match x {
        0 => println!("零"),
        1|2|3=> println!(" 1 or 2 or 3"),
        4..=6 => println!("4-6"),
        n => println!("其他数字: {}", n),
    }
    
    let tuple = (1, 2, 3,4);
    match tuple {
        (1, 2,..) => println!("第一个是 1"),
        _ => (),
    }
    
    let arr = [1, 2, 3];
    match arr {
        [0, _, _] => println!("第一个是 0"),
        [a, b, c] => println!("{},{},{}", a, b, c),
        _ => (),
    }
    
    let point = (10, 20);
    match point {
        (0, 0) => println!("原点"),
        (x, 0) => println!("x 轴: {}", x),
        (0, y) => println!("y 轴: {}", y),
        (x, y) => println!("坐标: ({}, {})", x, y),
    }
    #[derive(Debug)]
    struct Point { x: i32, y: i32 }
    let p1 = Point { x: 0, y: 0 };
    match p1 {
        Point { x: 0, y: 0 } => println!("原点"),
        Point { x, y } if x == y => println!("对角线"),
        Point { x, y } => println!("({}, {})", x, y),
    }
    
    enum Message {
        Quit,
        Move { x: i32, y: i32 },
        Write(String),
        ChangeColor(u8, u8, u8),
    }
    
    let msg = Message::Move { x: 10, y: 20 };
    match msg {
       Message::Quit => println!("退出"),
       Message::Move { x, y } => println!("移动到 ({}, {})", x, y),
       Message::Write(text) => println!("消息: {}", text),
       Message::ChangeColor(r, g, b) => println!("RGB: {},{},{}", r, g, b),
    }
    
    let num = &Some(5);
    match num {
        &Some(x) => println!("解引用后: {}", x),  // 直接取值
        // 或者
        Some(ref x) => println!("借用: {}", x),   // ref 表示引用
        None => (),
    }
    
    match x {
        7 | 8 if x % 2 == 0 => println!("7 或 8 且为偶数"),
        n if n < 0 => println!("负数"),
        n if n == 0 => println!("零"),
        n if n > 0 => println!("正数"),
        _ => (),
    }
    //所有分支必须返回相同类型:
    let result = match x {
        0 => "零".to_string(),
        n => format!("其他: {}", n),
    };
    println!("{}", result);
    //绑定运算符 @
    match x {
        n @ 1..=5 => println!("1~5: {}", n),
        n @ 6..=10 => println!("6~10: {}", n),
        _ => println!("其他"),
    }
    
    match p1 {
        p @ Point { x: 0, y: 0 } => println!("原点: {:?}", p),
        _ => (),
    }
    
    if let Some(value) = Some(5){ //if let Some(value) = Option::<i32>::None
        println!("有值: {}", value);
    } else {
        println!("无值");
    }
    
    let result: Result<i32, &str> = Err("error");
    if let Ok(value) = result {
        println!("成功: {}", value);
    } else {
        println!("失败");
    }
    
    let mut stack = vec![1, 2, 3, 4, 5];
    while let Some(top) = stack.pop() {
        println!("弹出: {}", top);// 输出:5 4 3 2 1
    }

}

//实战综合示例
use std::fs::File;
use std::io::Read;

fn main() {
    // 处理 Option
    let ages: Vec<Option<i32>> = vec![Some(10), None, Some(25)];
    for age in ages {
        if let Some(age) = age {
            if age < 18 {
                println!("未成年: {}", age);
            } else {
                println!("成年: {}", age);
            }
        } else {
            println!("年龄未知");
        }
    }

    // 处理 Result
    let mut file = File::open("test.txt");
    if let Ok(mut f) = file {
        let mut content = String::new();
        if let Ok(_) = f.read_to_string(&mut content) {
            println!("文件内容: {}", content);
        } else {
            println!("读取失败");
        }
    } else {
        println!("文件不存在");
    }

    // 枚举匹配
    #[derive(Debug)]
    enum UserAction {
        Create(String),
        Delete(i32),
        Update { id: i32, name: String },
    }
    let action = UserAction::Create("Alice".to_string());
    if let UserAction::Create(name) = action {
        println!("创建用户: {}", name);
    }
}