Связь образца в Rust
Иногда нужно и проверить форму, и сохранить
само значение целиком. Слева от знака
@ пишут имя, справа - образец,
который должен совпасть. Имя получает
исходное значение, а не только его часть.
Связь часто ставят перед диапазоном или перед вложенным образцом. Так в теле ветки удобно и пользоваться суженной формой, и обращаться ко всему числу или структуре.
Возьмем число в диапазоне от одного до пяти:
fn main() {
let n = 3;
let pick = match n {
x @ 1..=5 => x,
_ => 0,
};
println!("{}", pick);
}
На экране 3. Имя x держит n,
потому что число попало в диапазон, и
ветка вернула связанное значение.
Тот же прием с несколькими связями и запасной веткой:
fn main() {
let code = 404;
let hint = match code {
c @ 200..=299 => "ok",
c @ 400..=499 => "client",
_ => "other",
};
println!("{} {}", code, hint);
}
Дано число:
let n = 10;
Свяжите значение с v в образце
10..=20 и выведите v, иначе
выведите ноль.
Дано число:
let port = 443;
Сделайте ветку p @ 443 с текстом
"secure" и запасную с "plain",
выведите метку.
Скажите, какое значение получит имя слева
от @, если образец справа не совпал.