No elixir, temos Mapas:
> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a # = "one"
> map[:a] # = "one"
Também temos listas de palavras-chave:
> kl = [a: "one", b: "two"] # = [a: "one", b: "two"]
> kl2 = [{:a, "one"},{:b, "two"}] # = [a: "one", b: "two"]
> kl == kl2 # = true
> kl[:a] # = "one"
> kl.a # = ** (ArgumentError)
Por que ambos?
Sintaxe? É porque as Listas de Palavras-chave têm uma sintaxe mais flexível, permitindo que sejam definidas sem curvas e até mesmo sem colchetes como o último parâmetro de uma chamada de função? Então por que não dar ao Maps esse açúcar sintático?
Chaves duplicadas? É porque as listas de palavras-chave podem ter chaves duplicadas? Por que você deseja acesso ao estilo de mapa e chaves duplicadas?
Atuação? É porque as listas de palavras-chave têm melhor desempenho? Então por que o Maps? E os mapas não deveriam ter mais desempenho ao procurar membros por chave do que uma lista de tuplas?
JS Array e Ruby Hash gostam de aparência? É isso?
Eu entendo que estruturalmente eles são representações de dados diferentes. Para mim, parece que as listas de palavras-chave no elixir servem para complicar a linguagem por meio de sintaxe excepcional (3 variantes sintáticas diferentes), sobreposição de casos de uso com mapas e um benefício pouco claro.
Qual é a vantagem de usar listas de palavras-chave?
O principal benefício das listas de palavras-chave é a compatibilidade com versões anteriores do elixir e da base de código erlang existentes.
Eles também adicionam sintaxe de açúcar se usados como argumentos de funções que se assemelham a, por exemplo, uma sintaxe rubi:
A principal desvantagem de usar listas de palavras-chave é que não é possível realizar uma correspondência de padrão parcial nelas:
Vamos estendê-lo para argumentos de função. Imagine que precisamos lidar com uma função multicláusula com base no valor de uma das opções:
Isso nunca executará o
do_special_thing
:Com os argumentos do mapa funcionará:
fonte
Os mapas permitem apenas uma entrada para uma chave específica, enquanto as listas de palavras-chave permitem que a chave seja repetida. Os mapas são eficientes (principalmente à medida que crescem) e podem ser usados na correspondência de padrões do Elixir.
Em geral, use listas de palavras-chave para coisas como parâmetros de linha de comando e para passar opções, e use mapas (ou outra estrutura de dados, o HashDict) quando quiser uma matriz associativa.
fonte