Enumerações
A palavra-chave enum
permite a criação dum tipo que pode ser um das poucas variantes diferentes. Qualquer que é válido como uma struct
é também válido numa enum
.
// Criar uma `enum` para classificar um evento de Web.// Nota como nomes e o tipo da informação juntos especificam a variante:// `PageLoad != PageUnload` e `KeyPress(char) != Paste(String)`.// Cada um é diferente e independente.enum WebEvent {// Uma variante `enum` pode ser qualquer`unit-like`,PageLoad,PageUnload,// como estruturas de tupla,KeyPress(char),Paste(String),// ou estruturas parecidas de C.Click { x: i64, y: i64 },}// Uma função que recebe uma enumeração `WebEvent` como// um argumento e não retorna nada.fn inspect(event: WebEvent) {match event {WebEvent::PageLoad => println!("page loaded"),WebEvent::PageUnload => println!("page unloaded"),// Desestruturar `c` a partir duma variante `enum`.WebEvent::KeyPress(c) => println!("pressed '{}'.", c),WebEvent::Paste(s) => println!("pasted \"{}\".", s),// Desestruturar `Click` para `x` e `y`.WebEvent::Click { x, y } => {println!("clicked at x={}, y={}.", x, y);},}}fn main() {let pressed = WebEvent::KeyPress('x');// `to_owned()` cria uma `String` própria a partir// dum pedaço de sequência de caracteres.let pasted = WebEvent::Paste("my text".to_owned());let click = WebEvent::Click { x: 20, y: 80 };let load = WebEvent::PageLoad;let unload = WebEvent::PageUnload;inspect(pressed);inspect(pasted);inspect(click);inspect(load);inspect(unload);}
Pseudónimos de Tipo
Se usas um pseudónimo de tipo, podes fazer referência a cada variante de enumeração através do pseudónimo. Isto pode ser útil se o nome da enumeração for muito longo ou muito genérico, e queres renomeá-lo.
enum VeryVerboseEnumOfThingsToDoWithNumbers {Add,Subtract,}// Creates a type alias// Cria um pseudónimo de tipotype Operations = VeryVerboseEnumOfThingsToDoWithNumbers;fn main() {// Nós podemos fazer referência a cada variante através do pseudónimo,// e não seu nome longo e inconveniente.let x = Operations::Add;}
O lugar mais comum que verás isto é em blocos impl
usando o pseudónimo Self
.
enum VeryVerboseEnumOfThingsToDoWithNumbers {Add,Subtract,}impl VeryVerboseEnumOfThingsToDoWithNumbers {fn run(&self, x: i32, y: i32) -> i32 {match self {Self::Add => x + y,Self::Subtract => x - y,}}}
Para saberes mais sobre as enumerações e pseudónimos de tipo, podes ler o relatório de estabilização a partir de quando esta funcionalidade foi estabilizada para Rust.
Consulte também:
match
, fn
, e String
, RFC dos "Pseudónimos de tipo e variantes de enumeração" RFC