El pattern matching en Elixir no se limita a las tuplas o listas; también podemos aplicarlo a mapas y keyword lists, lo que nos abre un abanico interesante para extraer datos de forma clara y concisa. Empecemos por los mapas, que son estructuras clave-valor sin orden definido.
Cuando hacemos pattern matching con mapas, podemos usar subconjuntos de las claves para que el patrón coincida. Por ejemplo, si tenemos un mapa como %{a: 1, b: 2}, podemos hacer que un patrón coincida con solo una parte de ese mapa, como %{a: 1}, y el match será exitoso siempre que esa clave y valor estén presentes. Esto es posible porque el pattern matching en mapas permite que el patrón sea un submapa del mapa real.
Además, podemos usar variables en lugar de valores constantes para extraer datos. Si escribimos %{a: x} = mapa, la variable x tomará el valor asociado a la clave :a en mapa. Esto es muy útil para sacar múltiples valores a la vez, por ejemplo, %{nombre: n, bebida: b} = datos, donde n y b contendrán los valores correspondientes. También podemos usar el operador pin ^ para indicar que queremos que una variable ya definida coincida con el valor en el mapa, en lugar de asignarle uno nuevo.
Un detalle importante es que el orden de las claves en el patrón no importa, ya que los mapas no tienen orden. Podemos escribir %{bebida: b, nombre: n} o %{nombre: n, bebida: b} y el resultado será el mismo.
Por otro lado, las keyword lists son listas de pares clave-valor que sí mantienen orden. Esto implica que el pattern matching con keyword lists es más restrictivo. Para que un patrón coincida, la keyword list debe tener exactamente las mismas claves, en el mismo orden, y con los mismos valores o variables que el patrón. No podemos usar sublistas ni cambiar el orden de las claves sin que falle el match.
Por ejemplo, si tenemos una keyword list como [nombre: "Dani", país: "España", comida: "pizza"], el patrón debe coincidir en orden y contenido para que el match funcione. No podemos hacer un match con una lista vacía ni con una lista que tenga las claves en diferente orden.
Esto hace que, aunque podamos usar pattern matching con keyword lists, en la práctica es más cómodo y flexible hacerlo con mapas, especialmente cuando queremos extraer datos sin preocuparnos por el orden o por tener que especificar todas las claves.
En funciones, podemos aprovechar estas características para recibir parámetros en forma de mapas o keyword lists y extraer directamente los valores que nos interesan mediante pattern matching en los argumentos. Esto facilita la escritura de código más limpio y expresivo.
En resumen, el pattern matching con mapas nos permite trabajar con submapas, variables y el operador pin para controlar la coincidencia de valores, sin preocuparnos por el orden de las claves. En cambio, con keyword lists, el orden y la coincidencia exacta son obligatorios, lo que limita un poco su uso en pattern matching, aunque sigue siendo posible y útil en ciertos casos.