Перечисления для пользовательских типов
Используйте перечисления для определения типов, которые могут иметь один из нескольких вариантов и часто содержат связанные данные.
«Перечисления для пользовательских типов» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 3 уроков всего.
Перечисления: варианты пользовательских типов
Добро пожаловать в раздел «Перечисления для пользовательских типов»! В Rust перечисления позволяют определить тип, который может быть одним из нескольких возможных отдельных вариантов.
Представьте перечисление как способ сказать: «Этот элемент может быть A, ИЛИ B, ИЛИ C». Это чрезвычайно удобно для представления разных состояний или вариантов выбора.
Определение простого перечисления
Чтобы определить перечисление, используется ключевое слово enum, за которым следуют его имя и фигурные скобки с вариантами. Каждый вариант представляет отдельный выбор.
Вот простой пример для сторон света:
enum Direction {
North,
South,
East,
West,
}
fn main() {
let my_direction = Direction::North;
println!("My direction is {:?}", my_direction);
}Перечисления со связанными данными
В отличие от простых вариантов, варианты перечисления также могут содержать данные! Благодаря этому перечисления становятся очень мощными: каждый вариант может хранить собственный набор сведений.
Данные могут быть кортежем (например, (i32, String)) или структурой (например, { x: i32, y: i32 }).
Связанные данные на практике
Рассмотрим перечисление, в котором каждый вариант представляет отдельный тип сообщения: некоторые варианты содержат данные, а некоторые — нет.
Обратите внимание: Move использует структуру, Write — String, а ChangeColor — кортеж.
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
let m3 = Message::Write(String::from("hello"));
let m4 = Message::ChangeColor(255, 0, 128);
// We can't directly print enums with associated data using {:?}
// without deriving Debug, which we'll cover later.
// For now, just know these instances are created.
println!("Messages created!");
}Перечисление `Option`: обработка отсутствия значения
Одно из важнейших перечислений Rust — Option<T>. Оно используется для представления значений, которые могут существовать или отсутствовать, предотвращая распространённые в других языках ошибки, связанные с нулевыми указателями.
Some(T): вариант, содержащий значение типаT.None: вариант, обозначающий отсутствие значения.
Эффективное использование `Option<T>`
Option<T> заставляет явно обрабатывать случаи Some и None, делая код безопаснее и надёжнее. Никаких неожиданных сбоев из-за null!
Вот как его можно использовать:
fn find_item(id: i32) -> Option<String> {
if id == 7 {
Some(String::from("Found item 7!"))
} else {
None
}
}
fn main() {
let item1 = find_item(7);
let item2 = find_item(5);
println!("Item 1: {:?}", item1);
println!("Item 2: {:?}", item2);
}Кратко: перечисление `Result`
Другое важное перечисление — Result<T, E>, используемое для обработки ошибок. Оно имеет два варианта:
Ok(T): обозначает успешное выполнение и содержит полученное значение.Err(E): обозначает сбой и содержит значение ошибки.
В дальнейшем уроке мы подробно разберём Result, но уже сейчас важно знать, что это ещё один мощный шаблон перечисления!
Методы перечислений
Как и для структур, для перечислений можно определять методы с помощью блока impl. Эти методы могут выполнять действия или возвращать значения в зависимости от варианта перечисления.
Добавим метод call к рассмотренному ранее перечислению Message:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) {
println!("A message was called!");
}
}
fn main() {
let m = Message::Write(String::from("hello"));
m.call();
}Быстрая проверка по перечислениям
Какие из следующих утверждений о перечислениях Rust верны?
Повторение: перечисления для пользовательских типов
Отличная работа! Вы узнали, как перечисления Rust позволяют создавать пользовательские типы, которые могут иметь один из нескольких вариантов.
- Перечисления позволяют ясно моделировать варианты выбора и состояния.
- Варианты могут содержать связанные данные, что делает перечисления очень гибкими.
- Перечисление
Option<T>играет ключевую роль в безопасной обработке отсутствующих значений. - Для перечислений можно определять методы в блоках
impl.
Далее мы изучим работу с вариантами перечислений с помощью мощного сопоставления с образцом!
Часто задаваемые вопросы
Урок «Перечисления для пользовательских типов» бесплатный?
Да — полный текст урока «Перечисления для пользовательских типов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 3 уроков всего.
Чему я научусь в уроке «Перечисления для пользовательских типов»?
Используйте перечисления для определения типов, которые могут иметь один из нескольких вариантов и часто содержат связанные данные. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.
Сколько времени занимает урок «Перечисления для пользовательских типов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Определение и использование структур
- Перечисления для пользовательских типов
- Мощное сопоставление с образцом