Учебники

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

Списки ключевых слов — это удобный способ обращения к содержимому, хранящемуся в списках, по ключу, но под ним Elixir все еще просматривает список. Это может подойти, если у вас есть другие планы для этого списка, требующие просмотра всего этого, но это может быть ненужным, если вы планируете использовать ключи в качестве единственного подхода к данным.

Здесь карты приходят на помощь. Всякий раз, когда вам нужно хранилище значений ключей, карты представляют собой структуру данных «go to» в Elixir.

Создание карты

Карта создается с использованием синтаксиса% {} —

map = %{:a => 1, 2 => :b}

По сравнению со списками ключевых слов мы уже можем видеть два отличия:

  • Карты допускают любое значение в качестве ключа.
  • Ключи карт не следуют никакому порядку.

Доступ к ключу

Чтобы получить доступ к значению, связанному с ключом, Карты используют тот же синтаксис, что и списки ключевых слов —

Live Demo

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

Когда вышеуказанная программа запускается, она генерирует следующий результат —

1
b

Вставка ключа

Чтобы вставить ключ в карту, мы используем функцию Dict.put_new, которая принимает карту, новый ключ и новое значение в качестве аргументов —

Live Demo

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

Это вставит пару ключ-значение : new_val — «value» в новую карту. Когда вышеуказанная программа запускается, она генерирует следующий результат —

"value"

Обновление значения

Чтобы обновить значение, уже присутствующее на карте, вы можете использовать следующий синтаксис —

Live Demo

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

Когда вышеуказанная программа запускается, она генерирует следующий результат —

25

Сопоставление с образцом

В отличие от списков ключевых слов, карты очень полезны при сопоставлении с образцом. Когда карта используется в шаблоне, она всегда будет соответствовать подмножеству заданного значения —

Live Demo

%{: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) 

Другое интересное свойство карт заключается в том, что они предоставляют собственный синтаксис для обновления и доступа к ключам атомов —

Live Demo

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

Вышеуказанная программа генерирует следующий результат —

1

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