Elixir - listas de palavras-chave
Até agora, não discutimos nenhuma estrutura de dados associativa, ou seja, estruturas de dados que podem associar um determinado valor (ou vários valores) a uma chave. Diferentes idiomas chamam esses recursos com nomes diferentes, como dicionários, hashes, matrizes associativas, etc.
No Elixir, temos duas estruturas de dados associativas principais: listas de palavras-chave e mapas. Neste capítulo, vamos nos concentrar nas listas de palavras-chave.
Em muitas linguagens de programação funcional, é comum usar uma lista de tuplas de 2 itens como a representação de uma estrutura de dados associativa. No Elixir, quando temos uma lista de tuplas e o primeiro item da tupla (ou seja, a chave) é um átomo, o chamamos de lista de palavras-chave. Considere o seguinte exemplo para entender o mesmo -
list = [{:a, 1}, {:b, 2}]
Elixir suporta uma sintaxe especial para definir tais listas. Podemos colocar o cólon no final de cada átomo e nos livrar totalmente das tuplas. Por exemplo,
list_1 = [{:a, 1}, {:b, 2}]
list_2 = [a: 1, b: 2]
IO.puts(list_1 == list_2)
O programa acima irá gerar o seguinte resultado -
true
Ambos representam uma lista de palavras-chave. Como as listas de palavras-chave também são listas, podemos usar todas as operações que usamos nas listas delas.
Para recuperar o valor associado a um átomo na lista de palavras-chave, passe o átomo para [] após o nome da lista -
list = [a: 1, b: 2]
IO.puts(list[:a])
O programa acima gera o seguinte resultado -
1
As listas de palavras-chave têm três características especiais -
- As chaves devem ser átomos.
- As chaves são ordenadas, conforme especificado pelo desenvolvedor.
- As chaves podem ser fornecidas mais de uma vez.
Para manipular listas de palavras-chave, Elixir fornece o módulo de palavras-chave . No entanto, lembre-se de que as listas de palavras-chave são simplesmente listas e, como tal, fornecem as mesmas características de desempenho linear das listas. Quanto mais longa a lista, mais tempo levará para encontrar uma chave, para contar o número de itens e assim por diante. Por esse motivo, as listas de palavras-chave são usadas no Elixir principalmente como opções. Se você precisa armazenar muitos itens ou garantir associados de uma chave com um valor máximo de um, você deve usar mapas.
Acessando uma chave
Para acessar os valores associados a uma determinada chave, usamos o Keyword.getfunção. Ele retorna o primeiro valor associado à chave fornecida. Para obter todos os valores, usamos a função Keyword.get_values. Por exemplo -
kl = [a: 1, a: 2, b: 3]
IO.puts(Keyword.get(kl, :a))
IO.puts(Keyword.get_values(kl))
O programa acima irá gerar o seguinte resultado -
1
[1, 2]
Inserindo uma chave
Para adicionar um novo valor, use Keyword.put_new. Se a chave já existe, seu valor permanece inalterado -
kl = [a: 1, a: 2, b: 3]
kl_new = Keyword.put_new(kl, :c, 5)
IO.puts(Keyword.get(kl_new, :c))
Quando o programa acima é executado, ele produz uma nova lista de palavras-chave com a chave adicional c e gera o seguinte resultado -
5
Excluindo uma chave
Se você deseja excluir todas as entradas de uma chave, use Keyword.delete; para excluir apenas a primeira entrada de uma chave, use 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))
Isso irá deletar o primeiro b na lista e todos os ana lista. Quando o programa acima for executado, ele gerará o seguinte resultado -
0