Saltar al contenido principal

Enums y Pattern Matching

  • Se utilizan para representar un tipo que puede ser una de varias variantes
  • Las opciones se escriben con CamelCase
  • No almacenan valores directos como cadenas de texto o enteros por defecto
  • Se usan en el código para manejar diferentes estados o opciones
  • No se puede acceder al valor asociado como un String o int; en su lugar, se usa para manejar lógica en el código
fn main() {
    enum IpAddrKind {
        V4,
        V6,
    }

    // Se pueden definir variables de tipo enum
    let four = IpAddrKind::V4;
    let six = IpAddrKind::V6;

    // Se pueden definir funciones que tomen como argumento un enum
    fn route(ip_kind: IpAddrKind) {}

    route(IpAddrKind::V4);
    route(IpAddrKind::V6);

    // Se pueden definir structs que contengan un enum
    struct IpAddr {
        kind: IpAddrKind,
        address: String,
    }

    let home: IpAddr = IpAddr {
        kind: IpAddrKind::V4,
        address: String::from("127.0.0.1"),
    };

    let loopback: IpAddr = IpAddr {
        kind: IpAddrKind::V6,
        address: String::from("::1"),
    };

    // Se pueden definir enums con datos asociados
    enum IpAddr2 {
        V4(u8, u8, u8, u8),
        V6(String),
    }

    let home2 = IpAddr2::V4(127, 0, 0, 1);
    let loopback2 = IpAddr2::V6(String::from("::1"));
}
enum Rol {
Admin,
Usuario,
Invitado,
}

impl Rol {
fn to_string(&self) -> &'static str {
match self {
Rol::Admin => "ADMIN",
Rol::Usuario => "USUARIO",
Rol::Invitado => "INVITADO",
}
}
}

struct User {
username: String,
email: String,
rol: Rol,
}

let user = User {
username: String::from("lucas"),
email: String::from("[email protected]"),
rol: Rol::Invitado,
};

println!("El usuario {} es {}", user.username, user.rol.to_string());

let rol = Rol::Admin;
println!("Rol {}", rol.to_string());