Le mappe in Elixir sono la struttura dati per memorizzare informazioni in coppie chiave-valore. In altri linguaggi, queste potrebbero anche essere note come array associativi (PHP), hash (Perl 5, Raku) o dizionari (Python).
Chiavi e valori possono essere di qualsiasi tipo di dato, ma se la chiave è un atomo possiamo usare una sintassi abbreviata. Le mappe non garantiscono l'ordine delle loro voci quando vengono consultate o restituite.
Una mappa vuota si dichiara semplicemente con %{}. Se vogliamo aggiungere elementi a una mappa letterale, possiamo usare due forme:
# If the key is an atom:
%{atom_key: 1}
# If the key is a different type:
%{1 => :atom_value}
# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}
Anche se non esiste un formato canonico, scegli un modo coerente per rappresentare le coppie chiave-valore letterali.
Elixir fornisce molte funzioni per lavorare con le mappe nel modulo Map. Alcune funzioni del modulo Map richiedono che venga passata una funzione anonima per assistere nella trasformazione della mappa.
In Elixir, possiamo definire attributi di modulo che possono essere usati come costanti nelle nostre funzioni.
defmodule Example do
# Defines the attribute as the value 1
@constant_number 1
def example_value() do
# Returns the value 1
@constant_number
end
end
Quando vengono usati per definire costanti di modulo, gli attributi possono essere qualsiasi espressione che possa essere valutata al momento della compilazione. Dopo la compilazione, gli attributi di modulo non sono accessibili poiché vengono espansi durante la compilazione, in modo simile alle macro definite in linguaggi come C.
In questo esercizio implementerai un modo per tenere traccia dei punteggi più alti del gioco più popolare della tua sala giochi.
Per creare una nuova mappa dei punteggi più alti, definisci la funzione HighScore.new/0, che non accetta argomenti e restituisce una nuova mappa vuota dei punteggi.
HighScore.new()
# => %{}
Per aggiungere un giocatore alla mappa dei punteggi, definisci HighScore.add_player/3, una funzione che accetta 3 argomenti:
Memorizza il punteggio iniziale predefinito in un attributo del modulo. Servirà di nuovo.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}
Per rimuovere un giocatore dalla mappa dei punteggi, definisci HighScore.remove_player/2, che accetta 2 argomenti:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}
Per reimpostare il punteggio di un giocatore, definisci HighScore.reset_score/2, che accetta 2 argomenti:
La funzione deve funzionare anche se il giocatore non ha un punteggio.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}
Per aggiornare il punteggio di un giocatore aggiungendo al punteggio precedente, definisci HighScore.update_score/3, che accetta 3 argomenti:
La funzione deve funzionare anche se il giocatore non ha un punteggio precedente: in quel caso, presupponi che il punteggio precedente sia 0.
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}
Per ottenere una lista di giocatori, definisci HighScore.get_players/1, che accetta 1 argomento:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Iscriviti a Exercism per imparare e padroneggiare Elixir con 58 concetti168 esercizi e il mentoring di persone reali, tutto gratis.