Az Elixirben a map-ek az adatszerkezet, amely kulcs-érték párokban tárolja az információt. Más nyelvekben ezeket asszociatív tömböknek (PHP), hash-eknek (Perl 5, Raku) vagy szótáraknak (Python) is nevezhetik.
A kulcsok és az értékek bármilyen adattípusúak lehetnek, de ha a kulcs atom, használhatunk rövidített szintaxist. A map-ek nem garantálják a bejegyzések sorrendjét sem eléréskor, sem visszaadáskor.
Egy üres mapet egyszerűen a %{} szintaxissal deklarálunk. Ha elemeket szeretnénk hozzáadni egy map literálhoz, két formát használhatunk:
# 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}
Bár nincs kanonikus formátum, válassz egy következetes módot a kulcs-érték literálpárok ábrázolására.
Az Elixir számos függvényt kínál a map-ekkel való munkához a Map modulban. A Map modul egyes függvényei névtelen függvényt várnak paraméterként, amely segít a map átalakításában.
Az Elixirben definiálhatunk modulattribútumokat, amelyek konstansként használhatók a függvényeinkben.
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
Amikor modulkonstansok definiálására használjuk őket, az attribútumok bármilyen kifejezés lehetnek, amely kiértékelhető fordítási időben. A fordítás után a modulattribútumok nem érhetők el, mert a fordítás során kifejtődnek, akárcsak a C-hez hasonló nyelvekben a definiált makrók.
Ebben a feladatban egy módot valósítasz meg arra, hogy számon tartsd a helyi játékterem legnépszerűbb játékának csúcspontszámait.
Egy új csúcspontszámok mapjének létrehozásához definiáld a HighScore.new/0 függvényt, amely nem vesz át egyetlen argumentumot sem, és egy új, üres csúcspontszámok mapjét adja vissza.
HighScore.new()
# => %{}
Ahhoz, hogy felvegyél egy játékost a csúcspontszámok mapjébe, definiáld a HighScore.add_player/3 függvényt, amely 3 argumentumot vesz át:
Az alapértelmezett kezdőpontszámot modulattribútumban tárold. Később még szükség lesz rá.
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}
Ahhoz, hogy eltávolíts egy játékost a csúcspontszámok mapjéből, definiáld a HighScore.remove_player/2 függvényt, amely 2 argumentumot vesz át:
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")
# => %{}
Egy játékos pontszámának visszaállításához definiáld a HighScore.reset_score/2 függvényt, amely 2 argumentumot vesz át:
A függvénynek akkor is működnie kell, ha a játékosnak még nincs pontszáma.
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}
Ahhoz, hogy egy játékos pontszámát a korábbi pontszámhoz hozzáadva frissítsd, definiáld a HighScore.update_score/3 függvényt, amely 3 argumentumot vesz át:
A függvénynek akkor is működnie kell, ha a játékosnak nincs korábbi pontszáma: ilyenkor feltételezd, hogy a korábbi pontszám 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}
Ahhoz, hogy megkapd a játékosok listáját, definiáld a HighScore.get_players/1 függvényt, amely 1 argumentumot vesz át:
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"]
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.