Payloads Variantes

Puedes definir enumeraciones más completas en las que las variantes contienen datos. Después, puedes usar la instrucción match para extraer los datos de cada variante:

enum WebEvent {
    PageLoad,                 // Variant without payload
    KeyPress(char),           // Tuple struct variant
    Click { x: i64, y: i64 }, // Full struct variant
}

#[rustfmt::skip]
fn inspect(event: WebEvent) {
    match event {
        WebEvent::PageLoad       => println!("page loaded"),
        WebEvent::KeyPress(c)    => println!("pressed '{c}'"),
        WebEvent::Click { x, y } => println!("clicked at x={x}, y={y}"),
    }
}

fn main() {
    let load = WebEvent::PageLoad;
    let press = WebEvent::KeyPress('x');
    let click = WebEvent::Click { x: 20, y: 80 };

    inspect(load);
    inspect(press);
    inspect(click);
}
  • Solo se puede acceder a los valores de las variantes de enumeración una vez que coincidan con el patrón. El patrón vincula referencias a los campos del “brazo de coincidencias” después de =>.
    • La expresión se coteja con los patrones de arriba abajo. No hay ningún sistema de respaldo, como en C o C++.
    • La expresión de coincidencia tiene un valor. El valor es la última expresión en el brazo de coincidencia que se ha ejecutado.
    • Empezando por la parte superior, buscaremos el patrón que coincide con el valor y, a continuación, ejecutaremos el fragmento de código que sigue a la flecha. Cuando encontremos una coincidencia, pararemos.
  • Demuestra lo que pasa cuando la búsqueda no es exhaustiva. Ten en cuenta la ventaja que ofrece el compilador de Rust al confirmar cuándo se gestionan todos los casos.
  • match inspecciona un campo discriminante oculto en enum.
  • Se puede obtener el discriminante llamando a std::mem::discriminant().
    • Esto resulta útil si, por ejemplo, se implementa PartialEq en estructuras en las que la comparación de valores de campos no afecta a la igualdad.
  • WebEvent::Click { ... } no es exactamente lo mismo que WebEvent::Click(Click) con un nivel superior struct Click { ... }. La versión insertada no puede implementar traits, por ejemplo.