Списки ключевых слов — это удобный способ обращения к содержимому, хранящемуся в списках, по ключу, но под ним Elixir все еще просматривает список. Это может подойти, если у вас есть другие планы для этого списка, требующие просмотра всего этого, но это может быть ненужным, если вы планируете использовать ключи в качестве единственного подхода к данным.
Здесь карты приходят на помощь. Всякий раз, когда вам нужно хранилище значений ключей, карты представляют собой структуру данных «go to» в Elixir.
Создание карты
Карта создается с использованием синтаксиса% {} —
map = %{:a => 1, 2 => :b}
По сравнению со списками ключевых слов мы уже можем видеть два отличия:
- Карты допускают любое значение в качестве ключа.
- Ключи карт не следуют никакому порядку.
Доступ к ключу
Чтобы получить доступ к значению, связанному с ключом, Карты используют тот же синтаксис, что и списки ключевых слов —
map = %{:a => 1, 2 => :b} IO.puts(map[:a]) IO.puts(map[2])
Когда вышеуказанная программа запускается, она генерирует следующий результат —
1 b
Вставка ключа
Чтобы вставить ключ в карту, мы используем функцию Dict.put_new, которая принимает карту, новый ключ и новое значение в качестве аргументов —
map = %{:a => 1, 2 => :b} new_map = Dict.put_new(map, :new_val, "value") IO.puts(new_map[:new_val])
Это вставит пару ключ-значение : new_val — «value» в новую карту. Когда вышеуказанная программа запускается, она генерирует следующий результат —
"value"
Обновление значения
Чтобы обновить значение, уже присутствующее на карте, вы можете использовать следующий синтаксис —
map = %{:a => 1, 2 => :b} new_map = %{ map | a: 25} IO.puts(new_map[:a])
Когда вышеуказанная программа запускается, она генерирует следующий результат —
25
Сопоставление с образцом
В отличие от списков ключевых слов, карты очень полезны при сопоставлении с образцом. Когда карта используется в шаблоне, она всегда будет соответствовать подмножеству заданного значения —
%{:a => a} = %{:a => 1, 2 => :b} IO.puts(a)
Вышеуказанная программа генерирует следующий результат —
1
Это будет соответствовать 1 . И, следовательно, он будет генерировать вывод как 1 .
Как показано выше, карта совпадает до тех пор, пока ключи в шаблоне существуют на данной карте. Следовательно, пустая карта соответствует всем картам.
Переменные могут быть использованы при доступе, сопоставлении и добавлении ключей карты —
n = 1 map = %{n => :one} %{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}
Модуль Map предоставляет очень похожий API на модуль Keyword с удобными функциями для управления картами. Вы можете использовать такие функции, как Map.get, Map.delete , для управления картами.
Карты с ключами Atom
Карты имеют несколько интересных свойств. Когда все ключи на карте являются атомами, для удобства вы можете использовать синтаксис ключевого слова —
map = %{:a => 1, 2 => :b} IO.puts(map.a)
Другое интересное свойство карт заключается в том, что они предоставляют собственный синтаксис для обновления и доступа к ключам атомов —
map = %{:a => 1, 2 => :b} IO.puts(map.a)
Вышеуказанная программа генерирует следующий результат —
1
Обратите внимание, что для доступа к ключам атомов таким способом он должен существовать, иначе программа не сможет работать.