# Match

Rust tiene un operador de flujo de control extremadamente poderoso llamado match que le permite comparar un valor con una serie de patrones y luego ejecutar el c贸digo seg煤n el patr贸n que coincida.

TIP

  • Piense en una expresi贸n de match como una m谩quina clasificadora de monedas: las monedas se deslizan por una pista con orificios de diferentes tama帽os a lo largo de ella, y cada moneda cae por el primer orificio que encuentra que encaja. De la misma manera, los valores pasan por cada patr贸n en una coincidencia match, y en el primer patr贸n en el que el valor encaje, el valor cae en el bloque de c贸digo asociado para ser utilizado durante la ejecuci贸n.

Podemos escribir una funci贸n que puede tomar una moneda y, de manera similar a la m谩quina de conteo, determinar qu茅 moneda es y devolver谩 su valor en centimos, como se muestra aqu铆:

billetes euro

enum ColorBillete {
    gris,
    rojo,
    azul,
    naranja,
}

fn valor_por_color(color: ColorBillete) -> u32 {
    match color {
        ColorBillete::gris => 1,
        ColorBillete::rojo => 5,
        ColorBillete::azul => 10,
        ColorBillete::naranja => 25,
        _ => println!("Del resto no tenemos")
    }
}

La palabra clave match va seguida de una expresi贸n, que en este caso es el valor color. Esto parece muy similar a una expresi贸n utilizada con if, pero hay una gran diferencia: con if, la expresi贸n necesita devolver un valor booleano, pero aqu铆, puede ser de cualquier tipo.

Un brazo/rama de match tiene dos partes: un patr贸n y algo de c贸digo. El primer brazo aqu铆 tiene un patr贸n que es el valor ColorBillete::gris y luego el => operador que separa el patr贸n y el c贸digo para ejecutar. El c贸digo en este caso es solo el valor 1. Cada brazo est谩 separado del siguiente con una coma.

Rust tambi茅n tiene un patr贸n que podemos usar cuando no queremos enumerar todos los valores posibles. Por ejemplo, un u8 puede tener valores v谩lidos de 0 a 255. Si solo nos importan los valores 1, 3, 5 y 7, no queremos tener que enumerar 0, 2, 4, 6, 8, 9 hasta 255. Afortunadamente, no es necesario: podemos usar el patr贸n especial _ en su lugar.

El patr贸n _ coincidir谩 con cualquier valor. Al ponerlo despu茅s de nuestros otros brazos, el _ coincidir谩 con todos los casos posibles que no se hayan especificado antes. El () es solo el valor unitario, por lo que no suceder谩 nada en el caso _. Como resultado, podemos decir que no queremos hacer nada para todos los valores posibles que no enumeramos antes del marcador de posici贸n _.