Elixir - Cartes

Les listes de mots-clés sont un moyen pratique d'adresser le contenu stocké dans des listes par clé, mais en dessous, Elixir continue de parcourir la liste. Cela peut convenir si vous avez d'autres plans pour cette liste nécessitant de parcourir tout cela, mais cela peut être une surcharge inutile si vous prévoyez d'utiliser les clés comme seule approche des données.

C'est là que les cartes viennent à votre secours. Chaque fois que vous avez besoin d'un magasin clé-valeur, les cartes sont la structure de données «aller» dans Elixir.

Créer une carte

Une carte est créée en utilisant la syntaxe% {} -

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

Par rapport aux listes de mots clés, nous pouvons déjà voir deux différences -

  • Les cartes autorisent n'importe quelle valeur comme clé.
  • Les clés de Maps ne suivent aucun ordre.

Accéder à une clé

Pour accéder à la valeur associée à une clé, les cartes utilisent la même syntaxe que les listes de mots clés -

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

Lorsque le programme ci-dessus est exécuté, il génère le résultat suivant -

1
b

Insérer une clé

Pour insérer une clé dans une carte, nous utilisons le Dict.put_new fonction qui prend la carte, la nouvelle clé et la nouvelle valeur comme arguments -

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

Cela insérera la paire clé-valeur :new_val - "value"dans une nouvelle carte. Lorsque le programme ci-dessus est exécuté, il génère le résultat suivant -

"value"

Mettre à jour une valeur

Pour mettre à jour une valeur déjà présente dans la carte, vous pouvez utiliser la syntaxe suivante -

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

Lorsque le programme ci-dessus est exécuté, il génère le résultat suivant -

25

Correspondance de motif

Contrairement aux listes de mots clés, les cartes sont très utiles avec la correspondance de modèles. Lorsqu'une carte est utilisée dans un modèle, elle correspondra toujours à un sous-ensemble de la valeur donnée -

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

Le programme ci-dessus génère le résultat suivant -

1

Cela correspondra a avec 1. Et par conséquent, il générera la sortie comme1.

Comme indiqué ci-dessus, une carte correspond tant que les clés du modèle existent dans la carte donnée. Par conséquent, une carte vide correspond à toutes les cartes.

Les variables peuvent être utilisées lors de l'accès, de la correspondance et de l'ajout de clés de carte -

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

Le module Map fournit une API très similaire au module Keyword avec des fonctions pratiques pour manipuler les cartes. Vous pouvez utiliser des fonctions telles queMap.get, Map.delete, pour manipuler des cartes.

Cartes avec clés Atom

Les cartes sont livrées avec quelques propriétés intéressantes. Lorsque toutes les clés d'une carte sont des atomes, vous pouvez utiliser la syntaxe du mot-clé pour plus de commodité -

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

Une autre propriété intéressante des cartes est qu'elles fournissent leur propre syntaxe pour la mise à jour et l'accès aux clés atomiques -

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

Le programme ci-dessus génère le résultat suivant -

1

Notez que pour accéder aux clés atom de cette manière, il doit exister ou le programme échouera.