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 enenum
.- 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.
- Esto resulta útil si, por ejemplo, se implementa
WebEvent::Click { ... }
no es exactamente lo mismo queWebEvent::Click(Click)
con un nivel superiorstruct Click { ... }
. La versión insertada no puede implementar traits, por ejemplo.