Pattern matching de mapas y keyword lists

Ambas estructuras nos permiten usar el pattern matching para casar estructuras en función de si tienen o no elementos, además de poder sacar por el camino el valor de estas claves.

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.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos