Привязка @
Привязка @ используется в шаблонах сопоставления
для сохранения значения в переменную в тот момент,
когда это значение проверяется на соответствие
определённому шаблону. Это особенно полезно при работе
с перечислениями (enum), когда нужно одновременно
проверить вариант и сохранить связанные с ним данные.
Синтаксис привязки: имя_переменной @ шаблон.
Синтаксис
match value
{
name @ pattern => { /* ... */ },
_ => { /* ... */ }
}
Пример
Давайте создадим перечисление Message и
используем привязку @, чтобы сохранить
значение в переменную при сопоставлении:
enum Message
{
Quit,
Move { x: i32, y: i32 },
Write(String),
}
fn main()
{
let msg = Message::Write(String::from("abcde"));
match msg
{
m @ Message::Write(ref text) =>
{
println!("Message saved: {:?}", m);
println!("Text: {}", text);
},
_ => println!("Other message"),
}
}
Результат выполнения кода:
Message saved: Write("abcde")
Text: abcde
Пример
Давайте используем привязку @ с числовым
диапазоном, чтобы сохранить значение:
fn main()
{
let num = 5;
match num
{
n @ 1..=5 => println!("Number in range: {}", n),
n @ 6..=10 => println!("Number in range: {}", n),
_ => println!("Number out of range"),
}
}
Результат выполнения кода:
Number in range: 5
Пример
Давайте используем привязку @ вместе с
шаблоном Some для извлечения значения
из Option:
fn main()
{
let opt = Some(42);
match opt
{
val @ Some(n) =>
{
println!("Option value: {:?}", val);
println!("Inner number: {}", n);
},
None => println!("Nothing"),
}
}
Результат выполнения кода:
Option value: Some(42)
Inner number: 42
Смотрите также
-
оператор
match,
который выполняет сопоставление с образцом -
конструкция
if-let,
которая упрощает сопоставление с одним шаблоном -
конструкция
while-let,
которая выполняет сопоставление в цикле -
шаблон
деструктуризация,
который позволяет извлекать данные из enum