Эликсир - Списки ключевых слов
До сих пор мы не обсуждали какие-либо ассоциативные структуры данных, т. Е. Структуры данных, которые могут связывать определенное значение (или несколько значений) с ключом. В разных языках эти функции называются разными именами, такими как словари, хеши, ассоциативные массивы и т. Д.
В Elixir есть две основные ассоциативные структуры данных: списки ключевых слов и карты. В этой главе мы сосредоточимся на списках ключевых слов.
Во многих языках функционального программирования обычно используется список кортежей из двух элементов в качестве представления ассоциативной структуры данных. В Elixir, когда у нас есть список кортежей и первый элемент кортежа (то есть ключ) является атомом, мы называем его списком ключевых слов. Рассмотрим следующий пример, чтобы понять то же самое -
list = [{:a, 1}, {:b, 2}]
Эликсир поддерживает специальный синтаксис для определения таких списков. Мы можем поместить двоеточие в конец каждого атома и полностью избавиться от кортежей. Например,
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в списке. Когда вышеуказанная программа будет запущена, она выдаст следующий результат -
0