Cuando trabajamos con Keyword Lists y Mapas, es fundamental entender cómo manipularlos de manera eficiente usando operadores y funciones específicas. Empecemos por las Keyword Lists, que en esencia son listas de tuplas. Por esta razón, podemos utilizar el operador de suma ++ para concatenarlas, lo que resulta muy intuitivo. Al sumar dos Keyword Lists, obtenemos una nueva lista que contiene todas las claves y valores de ambas, simplemente concatenadas.
Sin embargo, esta misma operación no es aplicable a los mapas. No podemos usar un operador para sumar dos mapas, pero contamos con una función muy útil llamada Map.merge/2. Esta función recibe dos mapas y devuelve un nuevo mapa que combina las claves y valores de ambos. En caso de que una clave exista en ambos mapas, prevalece el valor del mapa que se pasa como segundo argumento, es decir, el que está a la derecha. Por ejemplo, si en el primer mapa la clave :a tiene el valor 1 y en el segundo mapa la clave :a tiene el valor 3, el resultado de la fusión tendrá :a con valor 3. Esto es muy útil para realizar actualizaciones o combinaciones de mapas sin perder información.
Para modificar mapas, existen varias funciones que nos permiten actualizar o eliminar claves. La función Map.put/3 es la forma más sencilla de insertar o actualizar una clave con un nuevo valor. Por ejemplo, si tenemos un mapa y queremos añadir la clave :c con valor 3, simplemente usamos Map.put(mapa, :c, 3), lo que nos devuelve un nuevo mapa con esa clave añadida o actualizada, sin modificar el mapa original.
Para obtener valores, podemos usar Map.get/3, que nos permite acceder al valor de una clave, y para eliminar claves, Map.delete/2 nos devuelve una copia del mapa sin la clave especificada. Estas funciones son fundamentales para trabajar con mapas de manera funcional, respetando la inmutabilidad.
Además, existe una sintaxis especial para actualizar parcialmente mapas usando el operador de barra vertical |. Este operador nos permite crear una copia de un mapa existente, modificando solo algunas claves específicas. Por ejemplo, si tenemos un mapa con claves como :nombre, :país y :comida, podemos hacer algo así:
persona = %{nombre: "Dani", país: "España", comida: "croquetas"}
persona_actualizada = %{persona | nombre: "Luis"}
Esto devuelve un nuevo mapa donde solo se ha cambiado el valor de :nombre a "Luis", manteniendo el resto igual. Es importante destacar que esta sintaxis solo funciona para actualizar claves que ya existen en el mapa; no podemos usarla para añadir nuevas claves. Si intentamos añadir una clave nueva con esta sintaxis, obtendremos un error.
Por otro lado, para eliminar claves no existe una sintaxis abreviada similar; la forma correcta es usar Map.delete/2. Por ejemplo, para eliminar la clave :nombre de un mapa, hacemos:
persona_sin_nombre = Map.delete(persona, :nombre)
Esto nos devuelve un mapa sin la clave :nombre, pero sin modificar el mapa original.
Finalmente, si queremos explorar más funciones relacionadas con mapas, el módulo Map ofrece varias opciones interesantes, como Map.has_key?/2, que nos permite verificar si un mapa contiene una clave determinada, devolviendo true o false. Esto puede ser útil para condicionales o validaciones antes de acceder a valores.
En resumen, manejar Keyword Lists y Mapas requiere conocer bien las funciones y operadores disponibles para concatenar, fusionar, actualizar y eliminar elementos, siempre respetando la inmutabilidad y aprovechando las herramientas que el lenguaje nos ofrece para trabajar de forma clara y eficiente.