Перелічувані типи
Ключове слово enum
дозволяє створити тип, який має кілька різних варіантів:
Speaker Notes
This slide should take about 5 minutes.
Ключові моменти:
- Переліки дозволяють збирати набір значень під одним типом.
- Напрямок - це тип з варіантами. Існує два значення
Direction
:Direction::Left
таDirection::Right
. PlayerMove
- це тип з трьома варіантами. На додаток до корисного навантаження, Rust зберігатиме дискримінант, щоб під час виконання знати, який варіант є у значенніPlayerMove
.- Це може бути гарний час для порівняння структури та переліки:
- В обох ви можете мати просту версію без полів (структура одиниць) або з різними типами полів (різні варіанти корисного навантаження).
- Ви навіть можете реалізувати різні варіанти переліку окремими структурами, але тоді вони не будуть одного типу, як якщо б всі вони були визначені в переліку.
- Rust використовує мінімальний обсяг пам’яті для зберігання дискримінанта.
-
Якщо потрібно, він зберігає ціле число найменшого необхідного розміру
-
Якщо допустимі значення варіантів не покривають усіх бітових шаблонів, для кодування дискримінанта буде використано неприпустимі бітові шаблони (“нішева оптимізація”). Наприклад,
Option<&u8>
зберігає або вказівник на ціле число, абоNULL
для варіантаNone
. -
За потреби можна керувати дискримінантом (наприклад, для сумісності з C):
Без
repr
тип дискримінанта займає 2 байти, оскільки 10001 вміщує 2 байти.
-
Більше інформації для вивчення
Rust має декілька оптимізацій, які можна застосувати, щоб зменшити розмір переліків.
-
Оптимізація нульового вказівника: для деяких типів Rust гарантує, що
size_of::<T>()
дорівнюєsize_of::<Option <T>>()
.Приклад коду, якщо ви хочете показати, як може виглядати побітове представлення на практиці. Важливо зазначити, що компілятор не надає жодних гарантій щодо цього представлення, тому це абсолютно небезпечно.