我试图与一个由解构的枚举变体构造的元组匹配,如下所示:
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为什么会这样呢?为什么我不能和一个元组竞争?
发布于 2020-08-20 09:46:21
,为什么我不能和一个元组竞争?
你可以和一个元组比赛。
您不能做的是匹配任意表达式,模式是受限制的语法。
检查元组的第一个元素是"aaa" (或者更一般地匹配一个非平凡的条件)的正确方法是使用模式保护。
match (field1, field2) {
(Some(a), None) if a == "aaa" => (),
_ => panic!()
}此外,不需要通过元组进行间接转换,模式具有“深度”,因此您可以在结构上直接执行相同的操作:
match var {
Enum::Var {field1: Some(a), field2: None} if a == "aaa" => {
}
_ => panic!()
}发布于 2020-08-20 13:51:49
除了如我的@Masklinn所示的match警卫之外,您还可以使用Option::as_deref()将Option<String>转换为Option<&str>,并与后者匹配:
match var {
Enum::Var { field1, field2 } => match (field1.as_deref(), field2.as_deref()) {
(Some("aaa"), None) => (),
_ => panic!(),
},
}https://stackoverflow.com/questions/63502329
复制相似问题