엘릭서에서 맵은 정보를 키-값 쌍으로 저장하는 자료 구조예요. 다른 언어에서는 이런 구조를 연관 배열(PHP), 해시(Perl 5, Raku), 딕셔너리(Python)라고 부르기도 해요.
키와 값은 어떤 자료형이든 될 수 있지만, 키가 아톰이면 축약 문법을 쓸 수 있어요. 맵은 항목을 조회하거나 반환할 때 순서를 보장하지 않아요.
빈 맵은 그냥 %{}로 선언해요. 맵 리터럴에 항목을 추가하고 싶다면 두 가지 형태를 쓸 수 있어요:
# 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}
정해진 표준 형식은 없지만, 키-값 리터럴 쌍을 표현하는 일관된 방식을 고르는 게 좋아요.
엘릭서는 _맵 모듈_에서 맵을 다루는 많은 함수를 제공해요. 일부 맵 모듈 함수는 맵 변환을 돕기 위해 익명 함수를 인자로 넘겨받아요.
엘릭서에서는 함수에서 상수처럼 쓸 수 있는 모듈 속성을 정의할 수 있어요.
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
모듈 상수를 정의할 때 쓰이는 속성은 컴파일 시점에 평가할 수 있는 어떤 표현식이든 될 수 있어요. 컴파일이 끝나면 모듈 속성에는 접근할 수 없어요. 컴파일 중에 확장되기 때문이에요. C 같은 언어에서 정의된 매크로와 비슷해요.
이 연습 문제에서는 동네 오락실에서 가장 인기 있는 게임의 최고 점수를 기록하는 방법을 구현해요.
새로운 최고 점수 맵을 만들려면, 인자를 받지 않고 비어 있는 새로운 최고 점수 맵을 반환하는 HighScore.new/0 함수를 정의해요.
HighScore.new()
# => %{}
최고 점수 맵에 플레이어를 추가하려면, 3개의 인자를 받는 HighScore.add_player/3 함수를 정의해요.
기본 초기 점수는 모듈 속성에 저장해요. 나중에 다시 필요해요.
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}
최고 점수 맵에서 플레이어를 제거하려면, 2개의 인자를 받는 HighScore.remove_player/2를 정의해요.
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")
# => %{}
플레이어의 점수를 초기화하려면, 2개의 인자를 받는 HighScore.reset_score/2를 정의해요.
이 함수는 플레이어가 점수를 가지고 있지 않은 경우에도 동작해야 해요.
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}
이전 점수에 더해서 플레이어의 점수를 갱신하려면, 3개의 인자를 받는 HighScore.update_score/3를 정의해요.
이 함수는 플레이어에게 이전 점수가 없는 경우에도 동작해야 해요. 이전 점수가 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}
플레이어 목록을 가져오려면, 1개의 인자를 받는 HighScore.get_players/1을 정의해요.
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"]
Exercism에 가입하고 Elixir 트랙을 개념 58개연습 문제 168개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.