Aprende Rust · Guía 6 de 8 · 1 min

Enums y match: que lo imposible no compile

Modela tu dominio con tipos para que el compilador te avise de los casos olvidados.

Los enums de Rust son mucho más potentes que en otros lenguajes, porque cada variante puede llevar sus propios datos.

enum Pago {
    Pendiente,
    Autorizado { codigo: String },
    Rechazado { motivo: String },
}

fn describir(p: &Pago) -> String {
    match p {
        Pago::Pendiente => "En espera".to_string(),
        Pago::Autorizado { codigo } => format!("Autorizado: {codigo}"),
        Pago::Rechazado { motivo } => format!("Rechazado: {motivo}"),
    }
}

Por qué es mejor que un booleano

Con campos sueltos, nada impide tener un pago marcado como rechazado que además tenga código de autorización. Con este enum, esa combinación no se puede representar: un pago rechazado simplemente no tiene codigo.

El compilador revisa todos los casos

match debe cubrir todas las variantes. Si agregas una variante nueva y olvidas manejarla, el programa no compila:

error[E0004]: non-exhaustive patterns: `Pago::Autorizado` not covered

Es una gran ayuda al cambiar código: el compilador te lleva a cada lugar que debes actualizar.

Un hábito para llevarte

Antes de escribir una validación, pregúntate si puedes diseñar el tipo para que el caso inválido no exista. Es una de las ideas más valiosas de Rust, y también se aplica en otros lenguajes.

Construye mejor software.

Seguridad, eficiencia y oficio, con fuentes y en español.