Раздел 41 · Zig с нуля

Перечисления и объединения

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Перечисления и объединения

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

Сегодня разберём два уровня: имя варианта и значение, связанное с выбранным вариантом.

Одна мысль урока

Перечисление ограничивает варианты, помеченное объединение связывает каждый вариант со своими данными.

Опора из прошлого урока: Структуры.

От картинки к записи

Перечисление enum содержит теги, например waiting, ready, cancelled. Тег это имя состояния. Такой тип нельзя случайно заполнить произвольным текстом. Функция, ожидающая Status, сообщает о несовместимой записи ещё при компиляции.

switch разбирает значение по вариантам. Для полного перечисления удобно перечислить все ветки: если позже добавится новый вариант, компилятор покажет места, где решение стало неполным. Ветка else бывает нужна, но может скрыть новое состояние под старым общим действием. Не добавляй её автоматически ради краткости.

Помеченное объединение

объявляют union(enum). В нашем примере waiting: void не несёт дополнительных данных, ready: u16 содержит номер полки, cancelled: []const u8 содержит текст. Одновременно активен только один вариант, а не все поля сразу.

Создание .{ .ready = 5 } выбирает готовый вариант. В switch запись .ready => |shelf| shelf раскрывает именно его содержимое. Имя shelf существует только в этой ветке и имеет тип u16. В ветке отмены номера полки нет: такой вопрос к данным не имеет смысла.

Пометка нужна для безопасного выбора активной части. Обычное непомеченное union применяется в более низкоуровневых договорах, но сегодня не нужно. Не убирай enum из объявления, думая, что это необязательная подпись. Она хранит знание о том, какой вариант сейчас действительно существует.

Объединение отличается от структуры. В структуре цена и количество присутствуют вместе. В объединении готовность с полкой и отмена с причиной исключают друг друга. Если поместить всё в структуру с множеством пустых значений, появятся невозможные состояния: одновременно готов и отменён. Хорошо выбранный тип уменьшает число таких комбинаций.

Срез причины отмены не становится собственной копией текста только от попадания в объединение. Договор срока жизни данных остаётся тем же, что в уроке про срезы. Сегодня используем строковый литерал, который хранится достаточно долго. При разборе входного буфера нужно помнить, кто владеет его байтами.

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.