Los mapas en Elixir son la estructura de datos para almacenar información en pares clave-valor. En otros lenguajes, también pueden conocerse como arrays asociativos (PHP), hashes (Perl 5, Raku) o diccionarios (Python).
Las claves y los valores pueden ser de cualquier tipo de dato, pero si la clave es un átomo podemos usar una sintaxis abreviada. Los mapas no garantizan el orden de sus entradas cuando se accede a ellas o se devuelven.
Un mapa vacío se declara simplemente con %{}. Si queremos añadir elementos a un literal de mapa, podemos usar dos formas:
# 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}
Aunque no existe un formato canónico, elige una forma consistente de representar los pares literales de clave-valor.
Elixir proporciona muchas funciones para trabajar con mapas en el módulo Map. Algunas funciones del módulo Map requieren que se pase una función anónima a la función para ayudar con la transformación del mapa.
En Elixir, podemos definir atributos de módulo que se pueden usar como constantes en nuestras funciones.
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
Cuando se usan para definir constantes de módulo, los atributos pueden ser cualquier expresión que se pueda evaluar en tiempo de compilación. Después de la compilación, no se puede acceder a los atributos de módulo, ya que se expanden durante la compilación, de forma similar a las macros definidas en lenguajes como C.
En este ejercicio vas a implementar una forma de llevar un registro de las puntuaciones máximas del juego más popular de tu salón recreativo.
Para crear un nuevo mapa de puntuaciones máximas, define la función HighScore.new/0, que no recibe ningún argumento y devuelve un mapa de puntuaciones máximas nuevo y vacío.
HighScore.new()
# => %{}
Para añadir un jugador al mapa de puntuaciones máximas, define HighScore.add_player/3, una función que recibe 3 argumentos:
Guarda la puntuación inicial predeterminada en un atributo de módulo. La necesitarás de nuevo.
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}
Para eliminar un jugador del mapa de puntuaciones máximas, define HighScore.remove_player/2, que recibe 2 argumentos:
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")
# => %{}
Para restablecer la puntuación de un jugador, define HighScore.reset_score/2, que recibe 2 argumentos:
La función también debe funcionar si el jugador no tiene una puntuación.
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}
Para actualizar la puntuación de un jugador sumándole la puntuación anterior, define HighScore.update_score/3, que recibe 3 argumentos:
La función también debe funcionar si el jugador no tiene una puntuación previa: asume que la puntuación previa es 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}
Para obtener una lista de jugadores, define HighScore.get_players/1, que recibe 1 argumento:
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"]
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.