如何解决针对元组的模式匹配
我正试图与由解构的枚举变量构造的元组匹配,如下所示:
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!()
}
但是,我收到错误消息
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
这是为什么?为什么我不能与元组匹配?
解决方法
为什么不能与元组匹配?
您可以匹配一个元组。
您不能对任意表达式进行匹配,模式是一种受限制的语法。
检查元组的第一个元素是否为"aaa"
(或更普遍地匹配非平凡条件)的正确方法是使用模式卫士:
match (field1,field2) {
(Some(a),None) if a == "aaa" => (),_ => panic!()
}
此外,不需要通过元组进行间接调用,模式具有“深度”,因此您可以直接在结构上执行相同的操作:
match var {
Enum::Var {field1: Some(a),field2: None} if a == "aaa" => {
}
_ => panic!()
}
,
除了@Masklinn所示的比赛后卫之外,您还可以使用Option::as_deref()
将Option<String>
转换为Option<&str>
,并与后者进行匹配:
match var {
Enum::Var { field1,field2 } => match (field1.as_deref(),field2.as_deref()) {
(Some("aaa"),None) => (),_ => panic!(),},}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。