Keyword Lists vs Maps em Elixir

Agora que já sabemos a diferença entre Listas e Tuplas, vamos conhecer e entender as Keyword Lists (listas de palavra-chave) e os Maps (mapas) no Elixir.

Como aprendemos anteriormente, uma lista convencional pode armazenar qualquer tipo de dados. Sendo assim, abaixo temos algumas implementações válidas.

[1, true, "jackson"]
[5,7,9]
["videos", "de", "ti"]

Ok. Vimos também que as tuplas podem armazenar tipos de dados variados. Vejamos:

{1, true, "jackson"}
{5,7,9}
{"videos", "de", "ti"}

Keyword Lists

Agora, imagine uma lista armazenando uma tupla com dois valores, assim:

[{:a, 22}, {:b, 77}] 

Isso é o que o Elixir chama de Keyword List (lista de palavra-chave). Ou seja, uma lista que possui internamente uma tupla em cada posição e essa tupla possui exatamente um átomo e um valor.

Uma outra forma de escrever essa mesma lista de palava-chave é essa:

[a: 22, b: 77]

Apesar da sutil diferença elas representam a mesma coisa, e essa segunda forma é muito mais ‘limpa’ para definir essa estrutura visto que as chaves são dispensadas e usamos uma sintaxe parecida com os Hashes do Ruby ou mesmo o JSON.

Independente disso, devemos lembrar que as listas de palavras-chave continuam sendo listas, e conforme vimos no outro post, elas são listas encadeadas em sua essência, e dessa forma temos os benefícios e malefícios dessa estrutura.

De qualquer sorte, podemos acessar os itens a partir do da chave de cada posição, veja:

x = [a: 22, b: 77]
x[:b]
77

Uma coisa interessante a se perceber é que por ser uma lista e não ser indexada, você pode ter várias chaves iguais, veja:

x = [a: 22, b: 77, a: 99]
iex(6)> x[:a]
22

O detalhe fica por conta do Elixir retornar o primeiro item encontrado ao percorrer a lista, ou seja, nesse caso, a ordem importa.

Em resumo…

  • Keyword Lists devem possuir átomos como chave
  • Nas Keyword Lists a ordem das chaves importa
  • Nas Keyword Lists podem existir chaves iguais

Maps %{ }

Os Maps são muito parecidos com as Keywords List pois também são formados por pares de chave-valor.

A primeira diferença fica por conta que os maps são indexados (ou seja, não é baseado em lista encadeada), a segunda é que não são permitidas chaves iguais, justamente por ela ser indexada, e a terceira é que a chave pode ser determinada por qualquer tipo de dado, não necessariamente um átomo.

Veja algumas implementações válidas:

m = %{:a => 1, 2 => :b}
n = %{"z" => 5, 8 => true}
m[2]
:b
n["z"]
5

Outra característica interessante é que também é possível acessar as chaves do tipo átomo através da sintaxe do ponto. Veja.

m = %{:a => 1, :b => "xyz"}
m.a
1
m.b
"xyz"

Legal, hein! :-)

Bom, é isso, pessoal! Acredito que com essa breve explicação você tenha aprendido mais um pouquinho sobre essa maravilhosa linguagem.

Ahh, se quiser receber mais dicas como essa, não esquece de assinar a nossa Newsletter semanal, e claro, se quiser nos ajudar é só nos seguir nas redes sociais e curtir a nossa página no Facebook.

É isso, gente! Até a próxima! ;-)