letnumber = 13; match number { 1 => println!("One!"), 2 => println!("Two!"), 3 => println!("Three!"), _ => println!("Something else!"), }
模式匹配的各种模式
字面值模式
1 2 3 4 5 6 7 8 9 10 11 12
letx = 1; lety = "Hello"; match x { 1 => println!("One"), 2 => println!("Two"), _ => println!("Other"), } match y { "Hello" => println!("Greeting"), "Goodbye" => println!("Farewell"), _ => println!("Other"), }
变量模式
将 x 赋值给 var,注意 x 所有权的转移
1 2 3 4
letx = 42; match x { var => println!("The value is: {}", var), }
通配符模式
1 2 3
match x { _ => println!("Any value"), }
结构模式
1 2 3 4 5 6 7
structPoint { x: i32, y: i32 } letp = Point { x: 0, y: 7 }; match p { Point { x, y: 0 } => println!("On the x axis at {}", x), Point { x: 0, y } => println!("On the y axis at {}", y), Point { x, y } => println!("On neither axis: ({}, {})", x, y), }
元组模式、枚举模式、解构模式
类似的,用于解构元组、枚举和其他复杂数据结构
守卫和绑定
守卫:在模式匹配中,可以使用守卫来添加额外的条件判断
先匹配模式,再检查条件
1 2 3 4 5
letx = 5; match x { n if n % 2 == 0 => println!("Even"), n => println!("Odd"), }
绑定:在模式匹配中,可以使用绑定来将模式中的值绑定到变量上
同时匹配模式并绑定变量
1 2 3 4 5
letx = 3 match x { var @ 1..=5 => println!("Value in range: {}", var), _ => println!("Out of range"), }
模式匹配的应用场景
处理错误
解析命令行参数
解析配置文件
解析数据包
解析 XML 或 JSON 等数据格式
处理错误
1 2 3 4 5 6 7 8 9 10 11 12
fndivide(a: i32, b: i32) ->Result<i32, String> { if b == 0 { Err(String::from("Cannot divide by zero")) } else { Ok(a / b) } }
enumMessage { Quit, Move { x: i32, y: i32 }, Write(String), ChangeColor(i32, i32, i32), } letmsg = Message::ChangeColor(0, 160, 255); match msg { // 解构 Message::ChangeColor(r, g, b) => { println!("Change the color to red {}, green {}, and blue {}", r, g, b) } _ => (), }
模式匹配与迭代器: 结合 iter 和 match 使用
1 2 3 4 5
letvec1 = vec![1, 2, 3]; letvec2 = vec![1, 2, 3]; for (a, b) in vec1.iter().zip(vec2) { println!("{} + {} = {}", a, b, a + b); }
letx = String::from("Hello"); match x { // 借用 x 的所有权,x 所有权没有转移 ref r => println!("Got a reference to a value: {:?}", r), } println!("x is still accessible: {}", x);
letx = String::from("Hello"); match x { refmut r => { *r += String::from("world") }, }