Добавить в корзинуПозвонить
Найти в Дзене
Ржавый код

Урок №5 - Перечисления

Перечисления Перечисления существуют во многих языках программирования, но их возможности различаются в каждом языке. Перечисления Rust аналогичны алгебраическим типам данных в функциональных языках, таких как F#, OCaml и Haskell. Функция `match` Rust полезна в сочетании с перечислениями, что позволяет легко запускать разный код для разных значений перечисления. Базовые перечисления Давайте посмотрим, как мы можем расширить список моих домашних животных с помощью my dog, используя перечисления. Сначала создадим перечисление, представляющее виды домашних животных, которые у нас есть, и запишем нашу структуру в Pet, которая принимает вид домашнего животного в качестве перечисления. Здесь мы определили два вида домашних животных: собаку и кошку. Теперь мы можем написать функцию, которая cможет вводить домашних животных и, наконец, создавать наших питомцев и выводить их всех на консоль. Обратите внимание, что для печати строки для нашего перечисления нам пришлось добавить атрибут `#[derive
Оглавление

Перечисления

Перечисления существуют во многих языках программирования, но их возможности различаются в каждом языке. Перечисления Rust аналогичны алгебраическим типам данных в функциональных языках, таких как F#, OCaml и Haskell. Функция `match` Rust полезна в сочетании с перечислениями, что позволяет легко запускать разный код для разных значений перечисления.

Базовые перечисления

Давайте посмотрим, как мы можем расширить список моих домашних животных с помощью my dog, используя перечисления. Сначала создадим перечисление, представляющее виды домашних животных, которые у нас есть, и запишем нашу структуру в Pet, которая принимает вид домашнего животного в качестве перечисления.

-2

Здесь мы определили два вида домашних животных: собаку и кошку. Теперь мы можем написать функцию, которая cможет вводить домашних животных и, наконец, создавать наших питомцев и выводить их всех на консоль.

-3

Обратите внимание, что для печати строки для нашего перечисления нам пришлось добавить атрибут `#[derive(Debug)]` к нашему перечислению, чтобы сообщить компилятору сгенерировать некоторый дополнительный код, который позволяет преобразовать наше перечисление в строку с `{:?}`.

Хорошо, итак, когда мы соберем все это вместе, мы сможем создать всех моих питомцев и использовать `introduce_pet`, чтобы представить их.

-4
-5

Это приведет к следующему результату нашей программы.

-6

Что позволило нам расширить код, чтобы включить всех моих питомцев.

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

Перечисления Rust

В Rust мы можем присваивать некоторые значения нашим перечислениям, что является мощным в сочетании с синтаксисом сопоставления с образцом. Представьте, что мы пишем систему HTTP-маршрутизатора, использующую функции.

-7

Для простоты я использую только строки, но с этим типом перечисления поддерживается любое значение. Мы можем передавать значения с помощью нашего перечисления и использовать синтаксис сопоставления с образцом с ключевым словом `match` для выполнения другого кода на основе полученных входных данных. Подобно структурам в Rust, мы можем не присваивать значений, как в случае с Unit-структурами с неназванным значениям, используя синтаксис `Tuple Struct`, и именованным значениям, используя классический синтаксис `C Struct`.

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

-8

Во-первых, я реализовал перечисление для нашей монеты, в котором есть орел и решка. Но в нашей программе подбрасывание монеты может быть нерешенным, когда монета падает на ребро. Вместо того, чтобы расширять наше перечисление с помощью этого варианта использования, мы можем использовать встроенную опцию `enum<T>`, которая позволяет нам возвращать `Some(T)` или `None`.

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

Упражнения

enums1.rs

-9

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

-10

enums2.rs

-11

В этом упражнении будут использоваться все различные типы возможных реализаций для перечислений. Для `Move` мы будем использовать классический синтаксис структуры `C`, для `Echo` и `changeColor` мы будем использовать синтаксис структуры `Tuple`, а для `Quit` - синтаксис `Unit Struct`.

-12

enums3.rs

-13

Давайте начнем с реализации перечисления сообщений, просмотрев функции, определенные в `State`. Мы можем видеть, что `change_color` использует кортеж с `(u8, u8, u8)`, `quit` не принимает параметры, `echo` принимает строку, а `move_position` принимает точку. Давайте начнем с реализации перечисления с этими значениями.

-14

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

-15

Это решает наше последнее упражнение для перечислений. Мы узнали, что перечисления могут содержать значения в Rust, подобные структурам, и что мы можем писать выражения соответствия для обработки различных значений для перечислений.

Статья на list-site.

-16