Color::CMYK(c, m, y, k) =>
println!("Голубой: {}, пурпурный: {}, жёлтый: {}, key (чёрный): {}!",
c, m, y, k),
// Нет необходимости в других ветвях, т.к были рассмотрены все варианты
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#[allow(...)], цветовая модель и перечисления
Для указателей необходимо различать деструктуризацию и разыменование, поскольку это разные концепции, которые используются иначе, чем в языке С.
• Разыменование использует *
• Деструктуризация использует &, ref и ref mut
fn main() {
// Присваиваем ссылку на тип `i32`.
// Символ `&` означает, что присваивается ссылка.
let reference = &4;
match reference {
// Если `reference` - это шаблон, который сопоставляется с `&val`,
// то это приведёт к сравнению:
// `&i32`
// `&val`
// ^ Мы видим, что если отбросить сопоставляемые `&`,
// то переменной `val` должно быть присвоено `i32`.
&val => println!("Получаем значение через деструктуризацию: {:?}", val),
}
// Чтобы избежать символа `&`, нужно разыменовывать ссылку до сопоставления.
match *reference {
val => println!("Получаем значение через разыменование: {:?}", val),
}
// Что если у нас нет ссылки? `reference` была с `&`,
// потому что правая часть была ссылкой. Но это не ссылка,
// потому что правая часть ею не является.
let _not_a_reference = 3;
// Rust предоставляет ключевое слово `ref` именно для этой цели.
// Оно изменяет присваивание так, что создаётся ссылка для элемента.
// Теперь ссылка присвоена.
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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה