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());