Enums (Enumerações)
A palavra-chave enum
permite a criação de um tipo que possui algumas variantes diferentes:
Speaker Notes
This slide should take about 5 minutes.
Pontos Chave:
- Enumerações permitem coletar um conjunto de valores em um tipo.
Direction
é um tipo com variantes. Existem dois valores deDirection
:Direction::Left
eDirection::Right
.PlayerMove
é um tipo com três variantes. Além dos payloads, o Rust armazenará um discriminante para que ele saiba em tempo de execução qual variante está em um valorPlayerMove
.- Este pode ser um bom momento para comparar structs e enums:
- Em ambos, você pode ter uma versão simples sem campos (unit struct, ou estrutura unitária) ou uma com diferentes tipos de campo (variant payloads ou cargas de variante).
- Você pode até mesmo implementar as diferentes variantes de uma enum com structs separadas, mas elas não seriam do mesmo tipo, como seriam se todas fossem definidas em uma enum.
- O Rust usa espaço mínimo para armazenar o discriminante.
-
Se necessário, armazena um inteiro do menor tamanho necessário
-
Se os valores de variante permitidos não cobrirem todos os padrões de bits, ele usará padrões de bits inválidos para codificar o discriminante (a “otimização de nicho”). Por exemplo,
Option<&u8>
armazena um ponteiro para um inteiro ouNULL
para a varianteNone
. -
É possível controlar o discriminante se necessário (p.ex., para compatibilidade com C):
Sem
repr
, o tipo do discriminante usa 2 bytes, porque 10001 cabe em 2 bytes.
-
Mais para Explorar
O Rust tem várias otimizações que pode empregar para fazer com que as enums ocupem menos espaço.
-
Otimização de ponteiro nulo: para alguns tipos, o Rust garante que
size_of::<T>()
é igual asize_of::<Option<T>>()
.Código de exemplo caso queira mostrar como a representação em bits pode ser na prática. É importante apontar que o compilador não oferece nenhuma garantia a respeito dessa representação, portanto isso é completamente inseguro.