针对元组的模式匹配

SeS*_*esa 1 pattern-matching rust

我正在尝试匹配从解构的枚举变体构造的元组,如下所示:

enum Enum {
  Var {
    field1: Option<String>,
    field2: Option<String>
  }
}

let var = Enum::Var {
  field1: Some("aaa".to_string()),
  field2: None
}

match var {
  Enum::Var {field1, field2} => {
    match (field1, field2) {
      (Some("aaa".to_string()), None) => (),
      _ => panic!()
    }
  }
  _ => panic!()
}

Run Code Online (Sandbox Code Playgroud)

但是,我收到错误消息

error: expected one of `)`, `,`, `...`, `..=`, `..`, or `|`, found `.`
  --> src/parser/test_admonitions.rs:61:22
   |
61 |         (Some("aaa".to_string()), None) => {}
   |                      ^
   |                      |
   |                      expected one of `)`, `,`, `...`, `..=`, `..`, or `|`
   |                      help: missing `,`

error: aborting due to 1 previous error
Run Code Online (Sandbox Code Playgroud)

为什么是这样?为什么我不能匹配元组?

Mas*_*inn 5

为什么我不能匹配元组?

您可以匹配元组。

你不能做的是匹配任意表达式,模式是一种受限制的语法。

检查元组的第一个元素是否"aaa"(或更普遍地匹配非平凡条件)的正确方法是使用模式保护

match (field1, field2) {
    (Some(a), None) if a == "aaa" => (),
    _ => panic!()
}
Run Code Online (Sandbox Code Playgroud)

此外,不需要通过元组进行间接访问,模式具有“深度”,因此您可以直接在结构上执行相同的操作:

match var {
    Enum::Var {field1: Some(a), field2: None} if a == "aaa" => {
    }
    _ => panic!()
}
Run Code Online (Sandbox Code Playgroud)