Translate

lunes, 21 de agosto de 2023

Enums en Rust parte 2


Ya vimos enums en Rust pero vamos a ver más característica: 


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 en las variantes de enumeración después de hacer pattern matching. E
    • La expresión se compara con los patrones de arriba a abajo. 
    • Comenza desde arriba, buscando qué patrón coincide con el valor y luego ejecuta el código que se encuentra a la derecha de la flecha. 
  • Tenga en cuenta la ventaja que proporciona el compilador de Rust al confirmar cuándo se manejan todos los casos.
  • match inspecciona los campos publicos de  la enumeración.
  • Es posible recuperar el discriminante llamando a std::mem::discriminant(). Esto es útil, por ejemplo, si se implementa PartialEq para estructuras donde comparar valores de campo no afecta la igualdad.
  • WebEvent::Click { ... } no es exactamente lo mismo que WebEvent::Click(Click) con una estructura de nivel superior Click { ... }. La versión en línea no puede implementar rasgos, por ejemplo.