[#] [Перевод] Rust: & и ref в паттернах
habrabot(difrex,1) — All
2016-07-28 15:00:04


![][1]
Как вам, думаю, известно, Раст входит в число языков реализующих [сопоставление с образцом][2] (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** являются двумя «операторами» часто используемых при этом. Разнице между ними и будет посвящена данная статья.
[Читать дальше →][3]

[1]: https://habrastorage.org/files/afc/ae4/dad/afcae4dad2184b1da76e3b23cf53a9bb.png
[2]: https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC
[3]: https://habrahabr.ru/post/306582/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut