Elixir - Mapy
Listy słów kluczowych to wygodny sposób zajmowania się treścią przechowywaną na listach według klucza, ale pod spodem Elixir wciąż przegląda listę. Może to być odpowiednie, jeśli masz inne plany dotyczące tej listy, które wymagają przejrzenia jej wszystkich, ale może to być niepotrzebne obciążenie, jeśli planujesz używać kluczy jako jedynego podejścia do danych.
Tutaj z pomocą przychodzą mapy. Zawsze, gdy potrzebujesz magazynu klucz-wartość, mapy są strukturą danych „idź do” w Elixirze.
Tworzenie mapy
Mapa jest tworzona przy użyciu składni% {} -
map = %{:a => 1, 2 => :b}
W porównaniu z listami słów kluczowych widzimy już dwie różnice -
- Mapy dopuszczają dowolną wartość jako klucz.
- Klawisze map nie podlegają żadnej kolejności.
Dostęp do klucza
Aby uzyskać dostęp do wartości związanej z kluczem, Mapy używają tej samej składni co Listy słów kluczowych -
map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])
Po uruchomieniu powyższego programu generuje następujący wynik -
1
b
Wkładanie klucza
Aby wstawić klucz do mapy, używamy Dict.put_new funkcja pobierająca mapę, nowy klucz i nową wartość jako argumenty -
map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value")
IO.puts(new_map[:new_val])
Spowoduje to wstawienie pary klucz-wartość :new_val - "value"na nowej mapie. Po uruchomieniu powyższego programu generuje następujący wynik -
"value"
Aktualizacja wartości
Aby zaktualizować wartość już obecną na mapie, możesz użyć następującej składni -
map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])
Po uruchomieniu powyższego programu generuje następujący wynik -
25
Dopasowywanie wzorców
W przeciwieństwie do list słów kluczowych, mapy są bardzo przydatne przy dopasowywaniu wzorców. Kiedy mapa jest używana we wzorcu, zawsze będzie pasować do podzbioru podanej wartości -
%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)
Powyższy program generuje następujący wynik -
1
To będzie pasować a z 1. W związku z tym wygeneruje dane wyjściowe jako1.
Jak pokazano powyżej, mapa pasuje tak długo, jak długo klucze we wzorcu istnieją w danej mapie. Dlatego pusta mapa pasuje do wszystkich map.
Zmiennych można używać podczas uzyskiwania dostępu, dopasowywania i dodawania kluczy map -
n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
Moduł Map zapewnia bardzo podobny interfejs API do modułu Keyword z wygodnymi funkcjami do manipulowania mapami. Możesz używać funkcji, takich jakMap.get, Map.deletedo manipulowania mapami.
Mapy z kluczami Atom
Mapy zawierają kilka interesujących właściwości. Gdy wszystkie klucze na mapie są atomami, dla wygody można użyć składni słów kluczowych -
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
Inną interesującą właściwością map jest to, że zapewniają one własną składnię do aktualizacji i uzyskiwania dostępu do kluczy atomów -
map = %{:a => 1, 2 => :b}
IO.puts(map.a)
Powyższy program generuje następujący wynik -
1
Zauważ, że aby uzyskać dostęp do kluczy atomów w ten sposób, powinien on istnieć, w przeciwnym razie program nie zadziała.