Los mapas en Elixir son la estructura de datos que sirve para almacenar información en pares clave-valor. En otros lenguajes también se los conoce 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 al acceder a ellas o al devolverlas.
Un mapa vacío simplemente se declara con %{}. Si queremos agregar elementos a un mapa literal, 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 clave-valor literales.
Elixir ofrece 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 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, los atributos de módulo ya no son accesibles, 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 los puntajes altos del juego más popular de tu salón de arcade local.
Para crear un nuevo mapa de puntajes altos, define la función HighScore.new/0, que no recibe ningún argumento y devuelve un mapa nuevo y vacío de puntajes altos.
HighScore.new()
# => %{}
Para agregar un jugador al mapa de puntajes altos, define HighScore.add_player/3, una función que recibe 3 argumentos:
Guarda el puntaje inicial predeterminado en un atributo de módulo. Lo vas a necesitar 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 a un jugador del mapa de puntajes altos, 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 reiniciar el puntaje de un jugador, define HighScore.reset_score/2, que recibe 2 argumentos:
La función también debe funcionar si el jugador no tiene un puntaje.
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 el puntaje de un jugador sumándole al puntaje anterior, define HighScore.update_score/3, que recibe 3 argumentos:
La función también debe funcionar si el jugador no tiene un puntaje anterior; asume que el puntaje anterior 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.