Выбрать главу

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`

},