Эликсир - Карты

Списки ключевых слов - это удобный способ адресации содержимого, хранящегося в списках, по ключу, но под ним 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

Обратите внимание, что для доступа к атомным ключам таким образом он должен существовать, иначе программа не сможет работать.