Rust на примерах — страница 15 из 65

// Оно изменяет присваивание так, что создаётся ссылка для элемента.

// Теперь ссылка присвоена.

let ref _is_a_reference = 3;

// Соответственно, для определения двух значений без ссылок,

// ссылки можно назначить с помощью `ref` и `ref mut`.

let value = 5;

let mut mut_value = 6;

// Используйте ключевое слово `ref` для создания ссылки.

match value {

ref r => println!("Получили ссылку на значение: {:?}", r),

}

// Используйте `ref mut` аналогичным образом.

match mut_value {

ref mut m => {

// Получаем ссылку. Её нужно разыменовать,

// прежде чем мы сможем что-то добавить.

*m += 10;

println!("Мы добавили 10. `mut_value`: {:?}", m);

},

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Структуры

Структуры могут быть деструктурированы следующим образом:

fn main() {

struct Foo { x: (u32, u32), y: u32 }

// деструктуризация члена структуры

let foo = Foo { x: (1, 2), y: 3 };

let Foo { x: (a, b), y } = foo;

println!("a = {}, b = {},  y = {} ", a, b, y);

// Вы можете деструктурировать структуру и переименовывать переменные,

// порядок при этом не важен

let Foo { y: i, x: j } = foo;

println!("i = {:?}, j = {:?}", i, j);

// а так же можно проигнорировать часть переменных:

let Foo { y, .. } = foo;

println!("y = {}", y);

// следующий код выдаст ошибку: в шаблоне нет упоминания поля `x`

// let Foo { y } = foo;

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

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 {

Some(42)

}

fn main() {

match some_number() {

// Вариант `Some`, выбираем, если его значение, привязанное к `n`,

// равно 42.

Some(n @ 42) => println!("Ответ: {}!", n),

// При других числах.

Some(n)      => println!("Не интересно... {}", n),

// Для всего остального (вариант `None`).

_            => (),

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX