XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
структуры, шаблон ref
Внутри конструкции match можно добавить ограничитель шаблонов для фильтрации возможных вариантов.
fn main() {
let pair = (2, -2);
// ЗАДАНИЕ ^ Попробуйте разные значения `pair`
println!("Расскажи мне о {:?}", pair);
match pair {
(x, y) if x == y => println!("Близнецы"),
// Данное ^ `условие if` является ограничителем шаблонов
(x, y) if x + y == 0 => println!("Антиматерия, бабах!"),
(x, _) if x % 2 == 1 => println!("Первое число нечётно"),
_ => println!("Нет корреляции..."),
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Tuples
Косвенный доступ к переменной делает невозможным ветвление и использование переменной без повторной привязки. match предоставляет символ @ для привязки значения к имени:
// Функция `age`, возвращающая `u32`.
fn age() -> u32 {
15
}
fn main() {
println!("Скажи мне свой возраст");
match age() {
0 => println!("Я ещё не отпраздновал свой первый день рождения"),
// Можно было бы использовать только 1 ... 12 в `match`,
// но какого возраста тогда был бы ребёнок? Вместо этого мы
// привязываем `n` к последовательности 1 .. 12.
// Теперь мы можем сообщить возраст.
n @ 1 ..= 12 => println!("Я ребёнок. Мне {:?}", n),
n @ 13 ..= 19 => println!("Я подросток. Мне {:?}", n),
// Ничего не привязываем.
n => println!("Я взрослый. Мне {:?}", n),
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Вы также можете использовать привязку для "деструктурирования" вариантов enum, таких как Option:
fn some_number() -> Option<u32> {
Some(42)
}
fn main() {
match some_number() {
// Вариант `Some`, выбираем, если его значение, привязанное к `n`,
// равно 42.
Some(n @ 42) => println!("Ответ: {}!", n),
// При других числах.
Some(n) => println!("Не интересно... {}", n),
// Для всего остального (вариант `None`).
_ => (),
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Функции, enum и Option
В некоторых случаях использование match выглядит неуклюже. Например:
#![allow(unused)]
fn main() {
// Создаём переменную `optional` типа `Option<i32>`
let optional = Some(7);
match optional {
Some(i) => {
println!("Это очень большая строка и `{:?}`", i);
// ^ Нужно 2 отступа только для того, чтобы извлечь `i`
},