Понимание перечислений и сопоставления с образцом является фундаментальным в Rust. Изучите эффективные методы для реализации обоих из них.
Rust предоставляет различные типы данных для выполнения операций, от базовых типов данных, таких как строки, целые числа и плавающие числа точек для составных типов данных, таких как векторы и массивы, для составных типов данных, таких как структуры и перечисления.
Enums (перечисления) — это тип данных, который позволяет представлять фиксированный набор значений, таких как дни недели и цвет радуги. Перечисления удобны, когда возможные значения переменной ограничены и известны.
Определение перечислений в Rust
Объявление перечислений в Rust похоже на объявление перечислений в C#. Вы будете использовать перечисление ключевое слово после имени и набор фигурных скобок для определения перечислений. Вы можете определить возможные варианты (сущности) в фигурных скобках с запятой в качестве разделителя.
Вот перечисление дней недели:
перечислениебудний день {
Понедельник,
Вторник,
Среда,
Четверг,
Пятница,
Суббота,
Воскресенье,
}
будний день 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 также предоставляет структуры, которые можно использовать для создания пользовательских типов с именованными полями. В отличие от перечислений, структуры позволяют вам определять поля разных типов, к которым вы можете обращаться и изменять их по отдельности.