// Оно изменяет присваивание так, что создаётся ссылка для элемента.
// Теперь ссылка присвоена.
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