До сих пор мы не обсуждали никаких ассоциативных структур данных, т. Е. Структур данных, которые могут связывать определенное значение (или несколько значений) с ключом. Разные языки называют эти функции разными именами, например словари, хэши, ассоциативные массивы и т. Д.
В Elixir у нас есть две основные ассоциативные структуры данных: списки ключевых слов и карты. В этой главе мы сосредоточимся на списках ключевых слов.
Во многих функциональных языках программирования обычно используется список из двух элементов в качестве представления ассоциативной структуры данных. В Elixir, когда у нас есть список кортежей, а первый элемент кортежа (т.е. ключ) является атомом, мы называем его списком ключевых слов. Рассмотрим следующий пример, чтобы понять то же самое —
list = [{:a, 1}, {:b, 2}]
Elixir поддерживает специальный синтаксис для определения таких списков. Мы можем поместить двоеточие в конец каждого атома и полностью избавиться от кортежей. Например,
list_1 = [{:a, 1}, {:b, 2}] list_2 = [a: 1, b: 2] IO.puts(list_1 == list_2)
Вышеуказанная программа сгенерирует следующий результат —
true
Оба из них представляют список ключевых слов. Поскольку списки ключевых слов также являются списками, мы можем использовать все операции, которые мы использовали в списках над ними.
Чтобы получить значение, связанное с атомом в списке ключевых слов, передайте атом как [] после имени списка —
list = [a: 1, b: 2] IO.puts(list[:a])
Вышеуказанная программа генерирует следующий результат —
1
Списки ключевых слов имеют три специальные характеристики —
- Ключи должны быть атомами.
- Ключи заказываются, как указано разработчиком.
- Ключи можно давать более одного раза.
Чтобы манипулировать списками ключевых слов, Elixir предоставляет модуль Keyword . Помните, однако, что списки ключевых слов — это просто списки, и поэтому они обеспечивают те же линейные характеристики производительности, что и списки. Чем длиннее список, тем больше времени потребуется для поиска ключа, подсчета количества предметов и т. Д. По этой причине списки ключевых слов используются в Elixir в основном в качестве параметров. Если вам нужно хранить много предметов или гарантировать связывание с одним ключом с максимальным значением, используйте карты.
Доступ к ключу
Чтобы получить доступ к значениям, связанным с данным ключом, мы используем функцию Keyword.get . Возвращает первое значение, связанное с данным ключом. Чтобы получить все значения, мы используем функцию Keyword.get_values. Например —
kl = [a: 1, a: 2, b: 3] IO.puts(Keyword.get(kl, :a)) IO.puts(Keyword.get_values(kl))
Вышеуказанная программа сгенерирует следующий результат —
1 [1, 2]
Вставка ключа
Чтобы добавить новое значение, используйте Keyword.put_new . Если ключ уже существует, его значение остается неизменным —
kl = [a: 1, a: 2, b: 3] kl_new = Keyword.put_new(kl, :c, 5) IO.puts(Keyword.get(kl_new, :c))
Когда вышеуказанная программа запускается, она создает новый список ключевых слов с дополнительным ключом c и генерирует следующий результат:
5
Удаление ключа
Если вы хотите удалить все записи для ключа, используйте Keyword.delete; чтобы удалить только первую запись для ключа, используйте Keyword.delete_first .
kl = [a: 1, a: 2, b: 3, c: 0] kl = Keyword.delete_first(kl, :b) kl = Keyword.delete(kl, :a) IO.puts(Keyword.get(kl, :a)) IO.puts(Keyword.get(kl, :b)) IO.puts(Keyword.get(kl, :c))
Это удалит первый b в списке и все a в списке. Когда вышеуказанная программа запущена, она выдаст следующий результат: