首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对元组进行模式匹配

对元组进行模式匹配
EN

Stack Overflow用户
提问于 2020-08-20 09:38:08
回答 2查看 3K关注 0票数 1

我试图与一个由解构的枚举变体构造的元组匹配,如下所示:

代码语言:javascript
复制
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!()
}

但是,我得到了错误消息。

代码语言:javascript
复制
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

为什么会这样呢?为什么我不能和一个元组竞争?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-20 09:46:21

,为什么我不能和一个元组竞争?

你可以和一个元组比赛。

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

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

代码语言:javascript
复制
match (field1, field2) {
    (Some(a), None) if a == "aaa" => (),
    _ => panic!()
}

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

代码语言:javascript
复制
match var {
    Enum::Var {field1: Some(a), field2: None} if a == "aaa" => {
    }
    _ => panic!()
}
票数 5
EN

Stack Overflow用户

发布于 2020-08-20 13:51:49

除了如我的@Masklinn所示的match警卫之外,您还可以使用Option::as_deref()Option<String>转换为Option<&str>,并与后者匹配:

代码语言:javascript
复制
match var {
    Enum::Var { field1, field2 } => match (field1.as_deref(), field2.as_deref()) {
        (Some("aaa"), None) => (),
        _ => panic!(),
    },
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63502329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档