Эликсир - Карты
Списки ключевых слов - это удобный способ адресации содержимого, хранящегося в списках, по ключу, но под ним Elixir все еще проходит по списку. Это может быть подходящим, если у вас есть другие планы для этого списка, требующие обхода всего его, но это может быть ненужными накладными расходами, если вы планируете использовать ключи в качестве единственного подхода к данным.
Здесь вам на помощь приходят карты. Всякий раз, когда вам нужно хранилище ключей и значений, карты являются структурой данных «перехода» в 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
Это будет соответствовать a с участием 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
Обратите внимание, что для доступа к атомным ключам таким образом он должен существовать, иначе программа не сможет работать.