Los mapas en Elixir son una estructura asociativa fundamental que nos permite vincular claves con valores, funcionando de manera similar a un diccionario. A diferencia de las listas de palabras clave, que también asocian claves y valores, los mapas son mucho más versátiles y eficientes, especialmente cuando necesitamos realizar consultas rápidas sobre elementos específicos.
Para definir un mapa, utilizamos el símbolo de porcentaje seguido de llaves. Por ejemplo, un mapa vacío se escribe como %{}. Dentro de estas llaves podemos colocar nuestras asociaciones de clave y valor, separadas por una flecha especial =>. Por ejemplo, si queremos asociar la clave :dia con el valor "Lunes", lo escribimos así:
mapa = %{:dia => "Lunes"}
Esta sintaxis nos permite guardar en la variable mapa un mapa con una única clave :dia que apunta al valor "Lunes".
Una diferencia importante entre mapas y listas de palabras clave es el tipo de claves que aceptan. En las listas de palabras clave, las claves solo pueden ser átomos, mientras que en los mapas podemos usar cualquier tipo de dato como clave. Por ejemplo, podemos tener números o cadenas de texto como claves sin problema:
mapa = %{1 => "Lunes", 2 => "Martes", "tres" => "Miércoles"}
Esto nos da mucha más flexibilidad para modelar datos, ya que no estamos limitados a usar solo átomos como claves.
Para acceder a los valores en un mapa, podemos usar la sintaxis de corchetes con la clave deseada, como mapa[:dia], que nos devolverá "Lunes". Sin embargo, cuando las claves son átomos, Elixir nos ofrece una forma más cómoda de acceder a los valores usando la notación de punto:
mapa.dia
Esta forma es especialmente útil porque, si intentamos acceder a una clave que no existe, Elixir nos lanzará un error, lo que puede ayudarnos a detectar problemas en nuestro código. En cambio, si usamos la sintaxis con corchetes y la clave no existe, simplemente obtendremos nil.
Otra diferencia clave entre mapas y listas de palabras clave es el orden de los elementos. Las listas de palabras clave son listas, por lo que mantienen el orden en que definimos sus elementos. Esto es importante cuando hacemos pattern matching o cuando el orden de los elementos tiene significado. Por ejemplo, si definimos una lista de palabras clave con b: 2, a: 1, el orden se mantiene tal cual.
En cambio, los mapas no mantienen ningún orden. Aunque Elixir puede mostrar las claves en orden alfabético cuando imprimimos un mapa, internamente no hay una noción de primer o último elemento. Esto significa que no podemos confiar en el orden de los elementos en un mapa, ya que es como un saco donde los elementos están mezclados.
Cuando todas las claves de un mapa son átomos, podemos usar una sintaxis más simplificada para definirlo, omitiendo la flecha => y usando dos puntos después de la clave:
mapa = %{dia: "Lunes", mes: "Enero"}
Esta forma es más legible y común en Elixir cuando trabajamos con claves que son átomos.
En resumen, los mapas nos ofrecen una estructura asociativa potente y flexible, con claves de cualquier tipo y acceso eficiente a sus valores. Nos permiten trabajar con datos sin preocuparnos por el orden de los elementos, lo que es ideal para muchas situaciones en programación funcional con Elixir.