Elixir: listas de palabras clave

Hasta ahora, no hemos discutido ninguna estructura de datos asociativa, es decir, estructuras de datos que puedan asociar un cierto valor (o múltiples valores) a una clave. Los diferentes lenguajes llaman a estas características con diferentes nombres como diccionarios, hashes, matrices asociativas, etc.

En Elixir, tenemos dos estructuras de datos asociativas principales: listas de palabras clave y mapas. En este capítulo, nos centraremos en las listas de palabras clave.

En muchos lenguajes de programación funcional, es común utilizar una lista de tuplas de 2 elementos como representación de una estructura de datos asociativa. En Elixir, cuando tenemos una lista de tuplas y el primer elemento de la tupla (es decir, la clave) es un átomo, lo llamamos lista de palabras clave. Considere el siguiente ejemplo para entender lo mismo:

list = [{:a, 1}, {:b, 2}]

Elixir admite una sintaxis especial para definir tales listas. Podemos colocar los dos puntos al final de cada átomo y deshacernos de las tuplas por completo. Por ejemplo,

list_1 = [{:a, 1}, {:b, 2}]
list_2 = [a: 1, b: 2]
IO.puts(list_1 == list_2)

El programa anterior generará el siguiente resultado:

true

Ambos representan una lista de palabras clave. Dado que las listas de palabras clave también son listas, podemos usar todas las operaciones que usamos en las listas en ellas.

Para recuperar el valor asociado con un átomo en la lista de palabras clave, pase el átomo como [] después del nombre de la lista -

list = [a: 1, b: 2]
IO.puts(list[:a])

El programa anterior genera el siguiente resultado:

1

Las listas de palabras clave tienen tres características especiales:

  • Las claves deben ser átomos.
  • Las claves se ordenan, según lo especificado por el desarrollador.
  • Las llaves se pueden entregar más de una vez.

Para manipular listas de palabras clave, Elixir proporciona el módulo de palabras clave . Sin embargo, recuerde que las listas de palabras clave son simplemente listas y, como tales, proporcionan las mismas características de rendimiento lineal que las listas. Cuanto más larga sea la lista, más tardará en encontrar una clave, contar el número de elementos, etc. Por esta razón, las listas de palabras clave se utilizan en Elixir principalmente como opciones. Si necesita almacenar muchos elementos o garantizar asociados de una tecla con un valor único máximo, debe usar mapas en su lugar.

Accediendo a una clave

Para acceder a los valores asociados con una clave dada, usamos el Keyword.getfunción. Devuelve el primer valor asociado con la clave dada. Para obtener todos los valores, usamos la función Keyword.get_values. Por ejemplo

kl = [a: 1, a: 2, b: 3] 
IO.puts(Keyword.get(kl, :a)) 
IO.puts(Keyword.get_values(kl))

El programa anterior generará el siguiente resultado:

1
[1, 2]

Insertar una llave

Para agregar un nuevo valor, use Keyword.put_new. Si la clave ya existe, su valor permanece sin cambios -

kl = [a: 1, a: 2, b: 3]
kl_new = Keyword.put_new(kl, :c, 5)
IO.puts(Keyword.get(kl_new, :c))

Cuando se ejecuta el programa anterior, produce una nueva lista de palabras clave con la clave adicional, cy genera el siguiente resultado:

5

Eliminar una clave

Si desea eliminar todas las entradas de una clave, utilice Keyword.delete; para eliminar solo la primera entrada de una clave, utilice Keyword.delete_first.

kl = [a: 1, a: 2, b: 3, c: 0]
kl = Keyword.delete_first(kl, :b)
kl = Keyword.delete(kl, :a)

IO.puts(Keyword.get(kl, :a))
IO.puts(Keyword.get(kl, :b))
IO.puts(Keyword.get(kl, :c))

Esto eliminará la primera b en la Lista y todos los aen la lista. Cuando se ejecuta el programa anterior, generará el siguiente resultado:

0