(
продолжение)

Как вам, думаю, известно, Раст входит в число языков реализующих
сопоставление с образцом (pattern matching). В случае если вам незнаком данный термин, вы можете думать о нём как об обобщёном
switch выражении в котором мы сравниваем объекты не только по значению, но и по
структуре:
match hashmap.get(&key) {
Some(value) => do_something_with(value),
None => { panic!("Oh noes!"); },
}
Разумеется сравнением дело не ограничивается. Как вы можете видеть в примере выше, объекты так же могут быть
деструктурированы во время сопоставления (
Some(value)) и их части присвоены другим переменным (
value), которые могут быть далее использованы в соответствующей ветви
match выражения.
Изящно, не правда ли? В Расте сопоставление с образцом это хлеб и масло не только для
match, но и для
for, (
if)
let и даже для обыкновенных аргументов функции.
Однако, долгое время я достаточно смутно представлял себе что происходит в случае когда мы добавляем к сопоставлению ссылки и заимствования.
& и
ref являются двумя «операторами» часто используемых при этом. Разнице между ними и будет посвящена данная статья.