Существует синтаксис Binding в сопоставлениях с образцами, к сожалению, не разрешено связывать внутри привязки ...
Связывание guard + может быть полезным, так как оно позволяет сопоставлять другие поля в Boo
, имеющие ограниченную охрану:
fn has_expected_name(name: &str) -> bool {
name.starts_with("boo") || name.starts_with("moo")
}
match foo {
Foo::Boo(ref boo @ Boo { field: Some(_) })
if has_expected_name(boo.field.as_ref().unwrap()) =>
{
unimplemented!("{:?}", boo);
}
_ => unimplemented!(),
}
Это дает понять, даже если определение has_expected_name
немного далеко, что оно получает доступ только к boo.field
и ничего больше.
Также возможно просто использовать привязку:
match foo {
Foo::Boo(ref boo @ Boo {
field: Some(_),
}) if boo.field.unwrap().starts_with("moo") || boo.field.unwrap().starts_with("boo") => {
unimplemented!("{:?}", boo);
}
_ => unimplemented!(),
}