Понимание перечислений и сопоставления с образцом является фундаментальным в Rust. Изучите эффективные методы для реализации обоих из них.

Rust предоставляет различные типы данных для выполнения операций, от базовых типов данных, таких как строки, целые числа и плавающие числа точек для составных типов данных, таких как векторы и массивы, для составных типов данных, таких как структуры и перечисления.

Enums (перечисления) — это тип данных, который позволяет представлять фиксированный набор значений, таких как дни недели и цвет радуги. Перечисления удобны, когда возможные значения переменной ограничены и известны.

Определение перечислений в Rust

Объявление перечислений в Rust похоже на объявление перечислений в C#. Вы будете использовать перечисление ключевое слово после имени и набор фигурных скобок для определения перечислений. Вы можете определить возможные варианты (сущности) в фигурных скобках с запятой в качестве разделителя.

Вот перечисление дней недели:

перечислениебудний день {
Понедельник,
Вторник,
Среда,
Четверг,
Пятница,
Суббота,
Воскресенье,
}
instagram viewer

будний день enum представляет дни недели. варианты являются названиями дней и не имеют связанных значений. Кроме того, варианты вашего перечисления могут быть любыми. Тип данных ржавчины.

Вы можете получить доступ к вариантам, указав имя варианта с помощью оператора разделителя пути (::) в перечислении.

позволять день = День недели:: Понедельник;

// статически типизированная версия переменной `day`
позволять день: День недели = День недели:: Понедельник;

Код указывает, что вы хотите получить доступ к Понедельник вариант перечисления дня недели.

Варианты и дискриминанты перечислений

Варианты перечисления связаны с целочисленными значениями, называемыми дискриминант. По умолчанию значения дискриминанта начинаются с нуля и увеличиваются на 1 для последующих вариантов; однако можно указать пользовательские значения дискриминанта для каждого варианта.

Вот пример перечисления Weekday с вариантами с присвоенным значением.

перечислениебудний день {
Понедельник = 1,
вторник = 2,
среда = 3,
Четверг = 4,
пятница = 5,
суббота = 6,
Воскресенье = 7,
}

Перечисление Weekday имеет семь вариантов, представляющих каждый день недели, и каждому дню присвоено значение (называемое дискриминантом). Варианты расположены в порядке от первого до последнего дня недели.

Вы можете получить доступ к значению дискриминанта, используя имя варианта.

фносновной() {
распечатать!("Понедельник: {}", День недели:: Понедельник какi32);
распечатать!("Вторник: {}", День недели:: вторник какi32);
распечатать!("Среда: {}", День недели:: Среда какi32);
распечатать!("Четверг: {}", День недели:: Четверг какi32);
распечатать!("Пятница: {}", День недели:: Пятница какi32);
распечатать!("Суббота: {}", День недели:: Суббота какi32);
распечатать!("Воскресенье: {}", День недели:: Воскресенье какi32);
}

распечатать! макрос используется для печати дискриминантов. Каждая печать! вызов макроса принимает два аргумента: строку формата и значение. Строка формата указывает, как форматировать вывод; значение - это фактическое значение, которое печатается.

В этом случае строка формата представляет собой строковый литерал, содержащий название дня недели, а значение представляет собой вариант перечисления с явным приведением к i32 целочисленный тип.

Явное приведение к i32 необходимо, потому что перечисления Rust представлены как целые числа, но конкретный целочисленный тип зависит от размера перечисления. По умолчанию Rust назначает наименьший целочисленный тип, который может представлять все дискриминанты в перечислении. Но в этом случае вы хотите напечатать значения как целые числа i32, поэтому вам нужно привести их явно.

Вот результат запуска основной функция:

Сопоставление шаблонов в Rust

Сопоставление с образцом — это конструкция управляющей структуры Rust, полезная для идентификации шаблонов данных. Сопоставление с образцом позволяет писать лаконичный и эффективный код при работе с расширенные структуры данных или выполнение сложных операций.

Вы будете использовать соответствовать ключевое слово, за которым следует => разделитель для шаблона и операция для шаблона соответственно. Шаблон может быть любым выражением Rust, включая литералы, переменные и вызовы функций.

Вот пример оператора соответствия:

фносновной(){
позволять х = 5;
соответствовать Икс {
1 => распечатать!("один"),
2 => распечатать!("два"),
3 => распечатать!("три"),

// запускается, если ни один из шаблонов не соответствует
_ => распечатать!("что-то другое"),
}
}

основной функция соответствует Икс против нескольких шаблонов, а затем печатает значение на основе значения x. Шаблон подчеркивания (_) — это шаблон подстановочных знаков, который используется для всех случаев, которые не обрабатываются явно.

Перечисления и сопоставление с образцом

Перечисления и сопоставление с образцом полезны для выражения и работы с расширенными структурами данных безопасным и эффективным способом. Вы можете использовать перечисления для определения фиксированного набора значений и сопоставления с образцом для работы с этими значениями.

Вот перечисление цветов радуги:

перечислениеРадуга {
Красный,
Апельсин,
Желтый,
Зеленый,
Синий,
Индиго,
Фиолетовый,
}

Каждый вариант Радуга enum представляет собой цвет радуги. Вы можете использовать сопоставление шаблонов с оператором match для сопоставления шаблонов с вариантом, чтобы управлять потоком программы на основе цвета радуги.

Вот функция, которая берет вариант цвета из перечисления Rainbow и печатает сообщение на основе цвета.

фнprint_color(цвет: радуга) {
соответствовать цвет {
Радуга:: Красный => распечатать!("Цвет красный!"),
Радуга:: Оранжевый => распечатать!("Цвет оранжевый!"),
Радуга:: Желтый => распечатать!("Цвет желтый!"),
Радуга:: Зеленый => распечатать!("Цвет зеленый!"),
Радуга:: Синий => распечатать!("Цвет голубой!"),
Радуга:: Индиго => распечатать!("Цвет индиго!"),
Радуга:: Фиолетовый => распечатать!("Цвет фиолетовый!"),
}
}

фносновной() {
позволять цвет = Радуга:: Синий;
print_color (цвет);
}

Вы можете получить варианты никогда не строятся или подобные предупреждения, когда вы попытаетесь выполнить приведенный выше код, потому что другие варианты, кроме варианта Blue, никогда не были созданы в этом коде. Таким образом, в этом случае вы можете смело игнорировать эти предупреждения, поскольку это сделано намеренно.

print_color Функция принимает параметр цвета типа перечисления Rainbow. Оператор match сопоставляет цвет из набора цветов, доступ к которому осуществляется через имена вариантов. И, наконец, сообщение печатается на основе совпадающего цвета.

Вы можете использовать сопоставление шаблонов для сложных операций, таких как несколько возвращаемых значений на основе условия.

фнрассчитать_длину волны(цвет: Радуга) -> U32 {
соответствовать цвет {

Радуга:: Красный => 700,
Радуга:: Оранжевый => 590,
Радуга:: Желтый => 570,
Радуга:: Зеленый => 510,
Радуга:: Синий => 475,
Радуга:: Индиго => 445,
Радуга:: Фиолетовый => 400,
}
}

рассчитать_длину волны Функция принимает цветовой вариант типа перечисления Rainbow в качестве параметра и возвращает 32-разрядное целое число без знака, представляющее собой длину волны цвета, соответствующего шаблону.

Rust также предоставляет структуры для создания пользовательских типов

Перечисления удобны для определения пользовательских типов для нескольких операций, особенно в случаях, когда поля известны и определены.

Rust также предоставляет структуры, которые можно использовать для создания пользовательских типов с именованными полями. В отличие от перечислений, структуры позволяют вам определять поля разных типов, к которым вы можете обращаться и изменять их по отдельности.