Enums

La palabra clave enum permite crear un tipo que tiene diferentes variantes:

fn generate_random_number() -> i32 {
    // Implementation based on https://xkcd.com/221/
    4  // Chosen by fair dice roll. Guaranteed to be random.
}

#[derive(Debug)]
enum CoinFlip {
    Heads,
    Tails,
}

fn flip_coin() -> CoinFlip {
    let random_number = generate_random_number();
    if random_number % 2 == 0 {
        return CoinFlip::Heads;
    } else {
        return CoinFlip::Tails;
    }
}

fn main() {
    println!("You got: {:?}", flip_coin());
}

Puntos Clave:

  • Las enumeraciones te permiten recoger un conjunto de valores en un solo tipo.
  • En esta página se ofrece el tipo de enumeración CoinFlip (tirar moneda) con dos variantes: Heads (cara) y Tails (cruz). Puede que veas el espacio de nombres cuando utilices variantes.
  • Este es un buen momento para comparar las estructuras y las enumeraciones:
    • En ambas puedes tener una versión sencilla sin campos (estructura unitaria) o una versión con distintos tipos de campos (variantes con carga útil).
    • En ambos casos, las funciones asociadas se definen en un bloque impl.
    • Incluso podrías implementar las distintas variantes de una enumeración con estructuras diferentes, pero entonces no serían del mismo tipo como lo serían si estuvieran todas definidas en una enumeración.