Одной из основных целей проекта Rust является безопасное системное программирование. Эта область обычно подразумевает императивную парадигму, что означает присутствие побочных эффектов, необходимость думать о разделяемом состоянии, и т.д. Для того, чтобы в таких условиях можно было обеспечить безопасность, программы и типы данных на Rust должны быть структурированы таким образом, чтобы их можно было статически проверить. Элементы и ограничения языка Rust совместно облегчают написание программ, проходящих эти проверки и, таким образом, обеспечивают безопасность. Например, в Rust глубоко интегрирована концепция владениям данными.
Выражение match
— это специальная конструкция, в которой эти особенности и ограничения сочетаются интересным образом. match
-выражение принимает входное значение, классифицирует его и затем передаёт выполнение коду, который обрабатывает соответствующий класс данных.
В этой статье мы рассмотрим, как работает match
в Rust. Вот основные элементы, которые match
и его дополнение, enum
, объединяют в единое целое:
- Структурное сопоставление с образцом: анализ вариантов и удобство использования гораздо лучше, чем при использовании
switch
в C или Java. - Исчерпывающий анализ:
match
гарантирует, что ни один вариант не пропущен. match
поддерживает и императивный, и функциональный стили: вы можете и дальше использовать операторbreak
, присваивания и прочее, и вам совершенно не нужно переучиваться на стиль, основанный на выражениях;match
умеет как «заимствовать», так и «перемещать»: Rust поощряет программиста думать о владении и заимствовании данных. Выражениеmatch
спроектировано в том числе с возможностью только заимствования части структуры вместо её перемещения. Это нужно для того, чтобы не передать право владения какими-либо данными раньше, чем нужно.
Мы рассмотрим каждый из этих пунктов по отдельности ниже, но для начала нам следует заложить фундамент дальнейшего обсуждения — как match
выглядит и работает?