Elisir - Mappe
Gli elenchi di parole chiave sono un modo conveniente per indirizzare i contenuti archiviati negli elenchi per chiave, ma sotto, Elixir sta ancora esplorando l'elenco. Potrebbe essere adatto se hai altri piani per quell'elenco che richiedono di esaminarlo tutto, ma può essere un sovraccarico non necessario se prevedi di utilizzare le chiavi come unico approccio ai dati.
È qui che le mappe vengono in tuo soccorso. Ogni volta che hai bisogno di un archivio chiave-valore, le mappe sono la struttura dati "vai a" in Elixir.
Creazione di una mappa
Viene creata una mappa utilizzando la sintassi% {} -
map = %{:a => 1, 2 => :b}
Rispetto agli elenchi di parole chiave, possiamo già vedere due differenze:
- Le mappe consentono qualsiasi valore come chiave.
- Le chiavi delle mappe non seguono alcun ordine.
Accesso a una chiave
Per accedere al valore associato a una chiave, Maps utilizza la stessa sintassi degli elenchi di parole chiave:
map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])
Quando il programma precedente viene eseguito, genera il seguente risultato:
1
b
Inserimento di una chiave
Per inserire una chiave in una mappa, usiamo il Dict.put_new funzione che prende la mappa, la nuova chiave e il nuovo valore come argomenti -
map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value")
IO.puts(new_map[:new_val])
Questo inserirà la coppia chiave-valore :new_val - "value"in una nuova mappa. Quando il programma precedente viene eseguito, genera il seguente risultato:
"value"
Aggiornamento di un valore
Per aggiornare un valore già presente nella mappa, puoi utilizzare la seguente sintassi:
map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])
Quando il programma precedente viene eseguito, genera il seguente risultato:
25
Pattern Matching
A differenza degli elenchi di parole chiave, le mappe sono molto utili con la corrispondenza dei modelli. Quando una mappa viene utilizzata in un modello, corrisponderà sempre a un sottoinsieme del valore dato -
%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)
Il programma di cui sopra genera il seguente risultato:
1
Questo corrisponderà a con 1. E quindi, genererà l'output come1.
Come mostrato sopra, una mappa corrisponde fintanto che le chiavi nel modello esistono nella mappa data. Pertanto, una mappa vuota corrisponde a tutte le mappe.
Le variabili possono essere utilizzate durante l'accesso, la corrispondenza e l'aggiunta di chiavi di mappa -
n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
Il modulo Map fornisce un'API molto simile al modulo Keyword con funzioni utili per manipolare le mappe. È possibile utilizzare funzioni comeMap.get, Map.delete, per manipolare le mappe.
Mappe con chiavi Atom
Le mappe vengono fornite con alcune proprietà interessanti. Quando tutte le chiavi in una mappa sono atomi, puoi utilizzare la sintassi della parola chiave per comodità:
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
Un'altra proprietà interessante delle mappe è che forniscono la propria sintassi per l'aggiornamento e l'accesso alle chiavi atom -
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
Il programma di cui sopra genera il seguente risultato:
1
Nota che per accedere alle chiavi atom in questo modo, dovrebbe esistere o il programma non funzionerà.