Карта

Карта — терм, реализующий интерфейс ассоциативного массива, то есть позволяет хранить данные в виде (КЛЮЧ, ЗНАЧЕНИЕ). То же: хеш-таблица, ассоциативный массив, map.

Карты, как новый тип данных в Эрланге, появились относительно недавно, в версии 17 Erlang/OTP — в 2014 г.

1> Age = #{"Alex" => 18, "Bob" => 21}.
#{"Alex" => 18,"Bob" => 21}
2> maps:put("Alex", 19, Age).
#{"Alex" => 19,"Bob" => 21}
3> maps:put("Ivan", 33, Age).
#{"Alex" => 18,"Bob" => 21,"Ivan" => 33}
4> Age.
#{"Alex" => 18,"Bob" => 21}

В первой строке мы создали карту и привязали её к переменной Age. Подразумевается, что мы в этой карте храним возраст неких людей. Во второй команде мы использовали put/3 из модуля maps, предназначенного для работы с картами, которые по-английски называют maps — карты. maps:put/3 “положила” новое значение. Но раз уже есть пара с ключом “Alex”, она просто перезаписалась, и теперь Алексу 19 лет. В третьей команде мы опять использовали maps:put/3. Но Ивана в нашей карте ещё не было, поэтому появилась третья пара.

Если вы внимательны, то заметили, что после 3-й команды мы получили значение выражения, в котором Алексу почему-то снова 18 лет. Далее мы просим выдать значение, какое сейчас у Age. И оказывается, что в нашей карте по-прежнему два значения, а не три, и Алексу правда всё ещё 18 лет.

Всё правильно, карту, как и любой другой тип данных мы, конечно, можем трансформировать во что-то другое. Но переменные в Эрланге иммутабельны. В 1-й строке левая и правая часть с помощью знака равенства сопоставляются, и поскольку к переменной Age ещё не привязано какое-то иное значение, значит, будет намертво привязано это: #{"Alex" => 18, "Bob" => 21}.

5> Age2 = maps:put("Ivan", 33, Age).
#{"Alex" => 18,"Bob" => 21,"Ivan" => 33}
6> Age2.
#{"Alex" => 18,"Bob" => 21,"Ivan" => 33}

Здесь мы вводим переменную Age2, и ей уже присваивается значение выражения, в котором три записи. За основу берётся переменная Age, к которой привязана исходная карта.

Документация

maps — документация по модулю maps из стандартной библиотеки. ordsets — по модулю ordsets, предназначенному для работы с упорядоченными картами.


© Алексей Карманов, 2024.