Maps sind in Elixir die Datenstruktur, um Informationen in Schlüssel-Wert-Paaren zu speichern. In anderen Programmiersprachen sind sie auch als assoziative Arrays (PHP), Hashes (Perl 5, Raku) oder Wörterbücher (Python) bekannt.
Schlüssel und Werte können einen beliebigen Datentyp haben. Ist der Schlüssel jedoch ein Atom, können wir eine Kurzsyntax verwenden. Beim Zugriff auf eine Map oder wenn sie zurückgegeben wird, ist die Reihenfolge ihrer Einträge nicht garantiert.
Eine leere Map erzeugst du einfach mit %{}. Wenn wir Einträge zu einer Map hinzufügen wollen, können wir zwei Formen verwenden:
# 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}
Es gibt kein kanonisches Format. Wähle trotzdem eine einheitliche Art, die Schlüssel-Wert-Paar-Literale darzustellen.
Elixir bietet viele Funktionen für die Arbeit mit Maps im Map-Modul. Einige Funktionen des Map-Moduls erwarten, dass eine anonyme Funktion übergeben wird, die bei der Transformation der Map hilft.
In Elixir können wir Modulattribute definieren, die wir als Konstanten in unseren Funktionen verwenden können.
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
Wenn sie zum Definieren von Modulkonstanten verwendet werden, können Attribute ein beliebiger Ausdruck sein, der zur Kompilierzeit ausgewertet werden kann. Nach der Kompilierung sind Modulattribute nicht mehr zugänglich, da sie während der Kompilierung expandiert werden, ähnlich wie definierte Makros in Sprachen wie C.
In dieser Übung implementierst du eine Möglichkeit, die Highscores für das beliebteste Spiel in deiner örtlichen Spielhalle im Blick zu behalten.
Um eine neue Highscore-Map zu erstellen, definiere die Funktion HighScore.new/0, die keine Argumente entgegennimmt und eine neue, leere Map mit Highscores zurückgibt.
HighScore.new()
# => %{}
Um einen Spieler zur Highscore-Map hinzuzufügen, definiere HighScore.add_player/3, eine Funktion, die 3 Argumente entgegennimmt:
Speichere die Standardpunktzahl für den Anfang in einem Modulattribut. Du wirst sie später noch brauchen.
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}
Um einen Spieler aus der Highscore-Map zu entfernen, definiere HighScore.remove_player/2, eine Funktion, die 2 Argumente entgegennimmt:
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")
# => %{}
Um die Punktzahl eines Spielers zurückzusetzen, definiere HighScore.reset_score/2, eine Funktion, die 2 Argumente entgegennimmt:
Die Funktion sollte auch funktionieren, wenn der Spieler noch keine Punktzahl hat.
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}
Um die Punktzahl eines Spielers zu aktualisieren, indem du etwas zur vorherigen Punktzahl hinzufügst, definiere HighScore.update_score/3, eine Funktion, die 3 Argumente entgegennimmt:
Die Funktion sollte auch funktionieren, wenn der Spieler noch keine vorherige Punktzahl hat. Geh davon aus, dass die vorherige Punktzahl 0 ist.
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}
Um eine Liste der Spieler zu erhalten, definiere HighScore.get_players/1, eine Funktion, die 1 Argument entgegennimmt:
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"]
Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.