Elixir - Mapas

Listas de palavras-chave são uma maneira conveniente de abordar o conteúdo armazenado em listas por chave, mas, por baixo, Elixir ainda está percorrendo a lista. Isso pode ser adequado se você tiver outros planos para essa lista que exijam uma análise completa, mas pode ser uma sobrecarga desnecessária se você estiver planejando usar as chaves como sua única abordagem para os dados.

É aqui que os mapas vêm em seu socorro. Sempre que você precisa de um armazenamento de valor-chave, os mapas são a estrutura de dados “ir para” no Elixir.

Criação de um mapa

Um mapa é criado usando a sintaxe% {} -

map = %{:a => 1, 2 => :b}

Em comparação com as listas de palavras-chave, já podemos ver duas diferenças -

  • Os mapas permitem qualquer valor como chave.
  • As chaves do Maps não seguem nenhuma ordem.

Acessando uma chave

Para acessar o valor associado a uma chave, o Maps usa a mesma sintaxe das listas de palavras-chave -

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

Quando o programa acima é executado, ele gera o seguinte resultado -

1
b

Inserindo uma chave

Para inserir uma chave em um mapa, usamos o Dict.put_new função que leva o mapa, nova chave e novo valor como argumentos -

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

Isso irá inserir o par de valores-chave :new_val - "value"em um novo mapa. Quando o programa acima é executado, ele gera o seguinte resultado -

"value"

Atualizando um valor

Para atualizar um valor já presente no mapa, você pode usar a seguinte sintaxe -

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

Quando o programa acima é executado, ele gera o seguinte resultado -

25

Correspondência de padrões

Em contraste com as listas de palavras-chave, os mapas são muito úteis com correspondência de padrões. Quando um mapa é usado em um padrão, ele sempre corresponderá a um subconjunto do valor fornecido -

%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)

O programa acima gera o seguinte resultado -

1

Isso vai combinar a com 1. E, portanto, ele irá gerar a saída como1.

Conforme mostrado acima, um mapa corresponde, desde que as chaves no padrão existam no mapa fornecido. Portanto, um mapa vazio corresponde a todos os mapas.

Variáveis ​​podem ser usadas ao acessar, combinar e adicionar chaves de mapa -

n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}

O módulo Mapa fornece uma API muito semelhante ao módulo Palavra-chave com funções convenientes para manipular mapas. Você pode usar funções como oMap.get, Map.delete, para manipular mapas.

Mapas com chaves Atom

Os mapas vêm com algumas propriedades interessantes. Quando todas as chaves em um mapa são átomos, você pode usar a sintaxe de palavra-chave por conveniência -

map = %{:a => 1, 2 => :b} 
IO.puts(map.a)

Outra propriedade interessante dos mapas é que eles fornecem sua própria sintaxe para atualizar e acessar as chaves atômicas -

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

O programa acima gera o seguinte resultado -

1

Observe que, para acessar as chaves atômicas dessa forma, elas devem existir ou o programa não funcionará.