Rust中支持模式匹配的位置:

  1. let声明
  2. 函数和闭包参数
  3. match表达式
  4. if let表达式
  5. while let 表达式
  6. for 表达式

let 声明

  1. fn main() {
  2. let (a, b) = (1, 2);
  3. let Point { x, y } = Point { x: 1, y: 2 };
  4. assert_eq!(1, a);
  5. assert_eq!(2, b);
  6. assert_eq!(1, x);
  7. assert_eq!(2, y);
  8. }
  9. struct Point {
  10. x: i32,
  11. y: i32,
  12. }

函数和闭包的参数位置 ref 模式

  1. fn main() {
  2. let s = sum("1".to_string(), "2".to_string());
  3. assert_eq!(s, "12".to_string());
  4. }
  5. fn sum(x: String, ref y: String) -> String {
  6. x + y
  7. }

ref 就是引用模式 借用的意思

  1. fn main() {
  2. let a = 42;
  3. let ref b = a;
  4. let c = &a;
  5. assert_eq!(b, c);
  6. let mut a = [1, 2, 3];
  7. let ref mut b = a;
  8. b[0] = 0;
  9. assert_eq!(a, [0, 2, 3]);
  10. }

match表达式

  1. fn check_optional(opt: Option<i32>) {
  2. match opt {
  3. Some(p) => println!("has value {}", p),
  4. None => println!("has no value"),
  5. }
  6. }
  7. fn handle_result(res: i32) -> Result<i32, dyn Error> {
  8. do_someting(res)?;
  9. //?等价于下面
  10. match do_someting(res) {
  11. ok(0) => Ok(o),
  12. Err(e) => SomeError(e),
  13. }
  14. }

if let

  1. fn main() {
  2. let x = &Some(3);
  3. if let Some(y) = x { //进行相互转换
  4. println!("1");
  5. y;
  6. }
  7. }