Enums
Enums definem um tipo que é uma de várias variantes. As variantes podem conter dados, tornando os enums ideais para máquinas de estado e modelos de erro.
Busque em todas as páginas da documentação
Enums definem um tipo que é uma de várias variantes. As variantes podem conter dados, tornando os enums ideais para máquinas de estado e modelos de erro.
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
fn handle(msg: Message) {
match msg {
Message::Quit => println!("quit"),
Message::Move { x, y } => println!("move {x},{y}"),
Message::Write(text) => println!("{text}"),
}
}
fn main() {
handle(Message::Write("hi".into()));
}Quando usar isso: Modelar estados mutuamente exclusivos, erros, comandos e nós AST.
enum Traffic {
Red,
Yellow,
Green,
}
impl Traffic {
fn next(self) -> Self {
match self {
Traffic::Red => Traffic::Green,
Traffic::Green => Traffic::Yellow,
Traffic::Yellow => Traffic::Red,
}
}
}
fn main() {
let t = Traffic::Red.next();
println!("{:?}", std::mem::discriminant(&t));
}O que isso demonstra:
implself em next para API de transição de estadomatch para tratamento exaustivoenum E {
Unit,
Tuple(i32, String),
Struct { id: u64 },
}Rust otimiza enums de nicho (por exemplo, Option<&T> tem o mesmo tamanho que &T). Nem todos os enums têm o mesmo tamanho da maior variante devido a otimizações.
Option e Resultenum Option<T> { None, Some(T) }
enum Result<T, E> { Ok(T), Err(E) }Veja a página dedicada para uso idiomático.
match não exaustivo - Nova variante quebra o código downstream. Correção: Trate como um evento de semântica de API; use #[non_exhaustive] para extensibilidade.Box para payload grande: Large(Box<Data>).enum Flag { Yes, No } é pior que bool a menos que mais estados estejam por vir. Correção: Use bool até que as variantes se multipliquem.Eq em payload float - Não disponível. Correção: Use representação inteira ou evite Eq.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Struct + flag bool | Apenas dois estados | Muitas transições ou payloads tipados |
| Objetos de trait | Conjunto aberto de tipos | Conjunto fechado - enum é mais rápido |
| Códigos inteiros | Interoperação FFI/C | Modelagem segura de domínio Rust |
crate bitflags | Muitas flags booleanas compactadas | Variantes semânticas importam |
Sim. Cada variante define sua própria forma de payload.
Pelo menos o da maior variante; otimizações de nicho podem encolher alguns (por exemplo, Option).
Sim, com impl Trait for MyEnum.
Crates externas não podem fazer match exaustivo - evolução de enum compatível com versões futuras.
Enum: conjunto fechado conhecido. Trait: implementações extensíveis entre crates.
Enums não podem ser genéricos por variante, mas o enum em si pode ser no estilo enum E<T> { Some(T), None } - use Option.
Option<NonNull<T>> e similares usam valores de nicho para None.
#[repr(C)] para controle de layout FFI - veja a seção Unsafe/FFI.
PascalCase para variantes, SCREAMING_SNAKE para o nome do enum não é usado - o enum também é PascalCase.
Adicione uma variante -> o compilador lista todos os locais de match para atualizar - recurso, não bug.
match#[derive(...)]Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026