Ключевое слово
Набор функций для работы с ключевыми словами.
Список ключевых слов — это список кортежей из двух элементов, где первый элемент кортежа — атом, а второй элемент может быть любым значением.
Например, следующий является списком ключевых слов:
[{:exit_on_close, true}, {:active, :once}, {:packet_size, 1024}] Elixir предоставляет специальный и более лаконичный синтаксис для списков ключевых слов, который выглядит так:
[exit_on_close: true, active: :once, packet_size: 1024]
Это также синтаксис, который Elixir использует для проверки списков ключевых слов:
iex> [{:active, :once}]
[active: :once] Два синтаксиса полностью эквивалентны. Как и атомы, ключевые слова должны состоять из символов Юникода, таких как буквы, цифры, знак подчеркивания и @. Если ключевое слово содержит символ, который не относится к указанной выше категории, например пробелы, его можно заключить в кавычки:
iex> ["exit on close": true] ["exit on close": true]
Заключение ключевого слова в кавычки не делает его строкой. Ключевые слова всегда являются атомами. Если вы используете кавычки, когда все символы являются допустимой частью ключевого слова без кавычек, Elixir выдаст предупреждение.
Обратите внимание, что когда списки ключевых слов передаются в качестве последнего аргумента функции, если используется сокращённый синтаксис, то квадратные скобки вокруг списка ключевых слов также могут быть опущены. Например, следующее:
String.split("1-0", "-", trim: true, parts: 2) эквивалентно:
String.split("1-0", "-", [trim: true, parts: 2]) Ключевое слово может иметь дублирующиеся ключи, поэтому это не строго говоря хранилище ключ-значение. Однако большинство функций в этом модуле ведут себя точно так же, как словарь, поэтому они работают аналогично функциям, которые вы найдёте в модуле Map.
Например, Keyword.get/3 получит первую запись, соответствующую заданному ключу, независимо от того, существуют ли дублирующиеся записи. Аналогично, Keyword.put/3 и Keyword.delete/3 гарантируют удаление всех дублирующихся записей для данного ключа при вызове. Обратите внимание, что операции, которые требуют поиска ключей в списке ключевых слов (например, Keyword.get/3), должны пройти по списку, чтобы найти ключи, поэтому эти операции могут быть медленнее, чем их аналоги в map.
Существует несколько функций для обработки дублирующихся ключей, в частности, Enum.into/2 позволяет создавать новые ключевые слова без удаления дублирующихся ключей, get_values/2 возвращает все значения для данного ключа и delete_first/2 удаляет только одну из существующих записей.
Функции в Keyword не гарантируют никаких свойств, когда дело доходит до порядка. Однако, поскольку список ключевых слов — это просто список, все операции, определенные в Enum и List, также могут быть применены, особенно когда требуется порядок.
Большинство функций в этом модуле работают за линейное время. Это означает, что время, необходимое для выполнения операции, растёт с такой же скоростью, что и длина списка.
Описание
Типы
Функции
- delete(keywords, key)
Удаляет записи в списке ключевых слов для определенного
key.- delete(keywords, key, value)
Удаляет записи в списке ключевых слов для
keyсvalue.- delete_first(keywords, key)
Удаляет первую запись в списке ключевых слов для определенного
key.- drop(keywords, keys)
Удаляет указанные ключи из списка ключевых слов.
- equal?(left, right)
Проверяет, равны ли два ключевых слова.
- fetch(keywords, key)
Извлекает значение для определенного
keyи возвращает его в кортеже.- fetch!(keywords, key)
Извлекает значение для определенного
key.- get(keywords, key, default \\ nil)
Получает значение для определенного
key.- get_and_update(keywords, key, fun)
Получает значение из
keyи обновляет его, всё в одном проходе.- get_and_update!(keywords, key, fun)
Получает значение из
keyи обновляет его. Вызывает исключение, если соответствующегоkeyнет.- get_lazy(keywords, key, fun)
Получает значение для определенного
key.- get_values(keywords, key)
Получает все значения для определенного
key.- has_key?(keywords, key)
Возвращает, существует ли данный
keyв данномkeywords.- keys(keywords)
Возвращает все ключи из списка ключевых слов.
- keyword?(term)
Возвращает
trueеслиtermявляется списком ключевых слов; в противном случае возвращаетfalse.- merge(keywords1, keywords2)
Объединяет два списка ключевых слов в один.
- merge(keywords1, keywords2, fun)
Объединяет два списка ключевых слов в один.
- new()
Возвращает пустой список ключевых слов, т.е. пустой список.
- new(pairs)
Создаёт список ключевых слов из перечислимого.
- new(pairs, transform)
Создаёт список ключевых слов из перечислимого с помощью функции преобразования.
- pop(keywords, key, default \\ nil)
Возвращает первое значение для
keyи удаляет все связанные записи в списке ключевых слов.- pop_first(keywords, key, default \\ nil)
Возвращает и удаляет первое значение, связанное с
keyв списке ключевых слов.- pop_lazy(keywords, key, fun)
Лениво возвращает и удаляет все значения, связанные с
keyв списке ключевых слов.- put(keywords, key, value)
Помещает указанное
valueподkey.- put_new(keywords, key, value)
Помещает данное
valueподkeyтолько если записьkeyещё не существует.- put_new_lazy(keywords, key, fun)
Вычисляет
funи помещает результат подkeyв списке ключевых слов, только еслиkeyещё не присутствует.- replace!(keywords, key, value)
Изменяет значение, хранящееся под
keyнаvalue, но только если записьkeyуже существует вkeywords.- split(keywords, keys)
Берёт все записи, соответствующие заданным ключам, и извлекает их в отдельный список ключевых слов.
- take(keywords, keys)
Берёт все записи, соответствующие заданным ключам, и возвращает их в новом списке ключевых слов.
- to_list(keyword)
Возвращает сам список ключевых слов.
- update(keywords, key, initial, fun)
Обновляет
keyвkeywordsс помощью данной функции.- update!(keywords, key, fun)
Обновляет
keyс помощью данной функции.- values(keywords)
Возвращает все значения из списка ключевых слов.
Типы
key()
Характеристики
key() :: atom()
t()
Характеристики
t() :: [{key(), value()}] t(значение)
Характеристики
t(value) :: [{key(), value}] value()
Характеристики
value() :: any()
Функции
delete(keywords, key)
Спецификации
delete(t(), key()) :: t()
Удаляет записи в списке ключевых слов для определенного key.
Если key не существует, возвращает список ключевых слов без изменений. Используйте delete_first/2 для удаления только первой записи в случае дублирующихся ключей.
Примеры
iex> Keyword.delete([a: 1, b: 2], :a) [b: 2] iex> Keyword.delete([a: 1, b: 2, a: 3], :a) [b: 2] iex> Keyword.delete([b: 2], :a) [b: 2]
delete(keywords, key, value)
Спецификации
delete(t(), key(), value()) :: t()
Удаляет записи в списке ключевых слов для key с value.
Если key с value не существует, возвращает список ключевых слов без изменений.
Примеры
iex> Keyword.delete([a: 1, b: 2], :a, 1) [b: 2] iex> Keyword.delete([a: 1, b: 2, a: 3], :a, 3) [a: 1, b: 2] iex> Keyword.delete([a: 1], :a, 5) [a: 1] iex> Keyword.delete([a: 1], :b, 5) [a: 1]
delete_first(keywords, key)
Спецификации
delete_first(t(), key()) :: t()
Удаляет первую запись в списке ключевых слов для определенного key.
Если key не существует, возвращает список ключевых слов без изменений.
Примеры
iex> Keyword.delete_first([a: 1, b: 2, a: 3], :a) [b: 2, a: 3] iex> Keyword.delete_first([b: 2], :a) [b: 2]
drop(keywords, keys)
Спецификации
drop(t(), [key()]) :: t()
Удаляет заданные ключи из списка ключевых слов.
Дублирующиеся ключи сохраняются в новом списке ключевых слов.
Примеры
iex> Keyword.drop([a: 1, b: 2, c: 3], [:b, :d]) [a: 1, c: 3] iex> Keyword.drop([a: 1, b: 2, b: 3, c: 3, a: 5], [:b, :d]) [a: 1, c: 3, a: 5]
equal?(left, right)
Спецификации
equal?(t(), t()) :: boolean()
Проверяет, равны ли два ключевых слова.
Два ключевых слова считаются равными, если они содержат одни и те же ключи, и эти ключи содержат одни и те же значения.
Примеры
iex> Keyword.equal?([a: 1, b: 2], [b: 2, a: 1]) true iex> Keyword.equal?([a: 1, b: 2], [b: 1, a: 2]) false iex> Keyword.equal?([a: 1, b: 2, a: 3], [b: 2, a: 3, a: 1]) true
fetch(keywords, key)
Спецификации
fetch(t(), key()) :: {:ok, value()} | :error Извлекает значение для определенного key и возвращает его в кортеже.
Если key не существует, возвращает :error.
Примеры
iex> Keyword.fetch([a: 1], :a)
{:ok, 1}
iex> Keyword.fetch([a: 1], :b)
:error fetch!(keywords, key)
Спецификации
fetch!(t(), key()) :: value()
Извлекает значение для определенного key.
Если key не существует, возникает исключение KeyError.
Примеры
iex> Keyword.fetch!([a: 1], :a) 1 iex> Keyword.fetch!([a: 1], :b) ** (KeyError) key :b not found in: [a: 1]
get(keywords, key, default \\ nil)
Спецификации
get(t(), key(), value()) :: value()
Получает значение для определенного key.
Если key не существует, возвращает значение по умолчанию (nil если значение по умолчанию не указано).
Если существуют дубликаты записей, возвращается первая из них. Используйте get_values/2 для получения всех записей.
Примеры
iex> Keyword.get([], :a) nil iex> Keyword.get([a: 1], :a) 1 iex> Keyword.get([a: 1], :b) nil iex> Keyword.get([a: 1], :b, 3) 3
С дублирующимися ключами:
iex> Keyword.get([a: 1, a: 2], :a, 3) 1 iex> Keyword.get([a: 1, a: 2], :b, 3) 3
get_and_update(keywords, key, fun)
Спецификации
get_and_update(t(), key(), (value() -> {get, value()} | :pop)) :: {get, t()}
when get: term() Получает значение из key и обновляет его за один проход.
Этот fun аргумент получает значение key (или nil если key отсутствует) и должен возвращать кортеж из двух элементов: значение "get" (извлеченное значение, которое может быть обработано перед возвратом) и новое значение для хранения под key. fun также может возвращать :pop, что означает, что текущее значение должно быть удалено из списка ключевых слов и возвращено.
Возвращаемое значение представляет собой кортеж со значением "get", возвращаемым fun, и новым списком ключевых слов с обновленным значением под key.
Примеры
iex> Keyword.get_and_update([a: 1], :a, fn current_value ->
...> {current_value, "new value!"}
...> end)
{1, [a: "new value!"]}
iex> Keyword.get_and_update([a: 1], :b, fn current_value ->
...> {current_value, "new value!"}
...> end)
{nil, [b: "new value!", a: 1]}
iex> Keyword.get_and_update([a: 1], :a, fn _ -> :pop end)
{1, []}
iex> Keyword.get_and_update([a: 1], :b, fn _ -> :pop end)
{nil, [a: 1]} get_and_update!(keywords, key, fun)
Спецификации
get_and_update!(t(), key(), (value() -> {get, value()})) :: {get, t()}
when get: term() Получает значение из key и обновляет его. Вызывает исключение, если key отсутствует.
Этот fun аргумент получает значение key и должен возвращать кортеж из двух элементов: значение "get" (извлеченное значение, которое может быть обработано перед возвратом) и новое значение для хранения под key.
Возвращаемое значение представляет собой кортеж со значением "get", возвращаемым fun, и новым списком ключевых слов с обновленным значением под key.
Примеры
iex> Keyword.get_and_update!([a: 1], :a, fn current_value ->
...> {current_value, "new value!"}
...> end)
{1, [a: "new value!"]}
iex> Keyword.get_and_update!([a: 1], :b, fn current_value ->
...> {current_value, "new value!"}
...> end)
** (KeyError) key :b not found in: [a: 1]
iex> Keyword.get_and_update!([a: 1], :a, fn _ ->
...> :pop
...> end)
{1, []} get_lazy(keywords, key, fun)
Спецификации
get_lazy(t(), key(), (() -> value())) :: value()
Получает значение для определенного key.
Если key не существует, лениво вычисляет fun и возвращает его результат.
Это полезно, если значение по умолчанию очень дорого обходится в вычислениях или его сложно настраивать и разбирать.
Если существуют дубликаты записей, возвращается первая из них. Используйте get_values/2 для получения всех записей.
Примеры
iex> keyword = [a: 1] iex> fun = fn -> ...> # some expensive operation here ...> 13 ...> end iex> Keyword.get_lazy(keyword, :a, fun) 1 iex> Keyword.get_lazy(keyword, :b, fun) 13
get_values(keywords, key)
Спецификации
get_values(t(), key()) :: [value()]
Получает все значения для определенного key.
Примеры
iex> Keyword.get_values([], :a) [] iex> Keyword.get_values([a: 1], :a) [1] iex> Keyword.get_values([a: 1, a: 2], :a) [1, 2]
has_key?(keywords, key)
Спецификации
has_key?(t(), key()) :: boolean()
Возвращает, существует ли данный key в данном keywords.
Примеры
iex> Keyword.has_key?([a: 1], :a) true iex> Keyword.has_key?([a: 1], :b) false
keys(keywords)
Спецификации
keys(t()) :: [key()]
Возвращает все ключи из списка ключевых слов.
Дублирующиеся ключи отображаются дублированными в окончательном списке ключей.
Примеры
iex> Keyword.keys(a: 1, b: 2) [:a, :b] iex> Keyword.keys(a: 1, b: 2, a: 3) [:a, :b, :a]
keyword?(term)
Спецификации
keyword?(term()) :: boolean()
Возвращает true, если term является списком ключевых слов; в противном случае возвращает false.
Примеры
iex> Keyword.keyword?([])
true
iex> Keyword.keyword?(a: 1)
true
iex> Keyword.keyword?([{Foo, 1}])
true
iex> Keyword.keyword?([{}])
false
iex> Keyword.keyword?([:key])
false
iex> Keyword.keyword?(%{})
false merge(keywords1, keywords2)
Спецификации
merge(t(), t()) :: t()
Объединяет два списка ключевых слов в один.
Все ключи, включая дубликаты, указанные в keywords2, будут добавлены к keywords1, перезаписывая любые существующие.
Нет гарантий относительно порядка ключей в возвращаемом ключевом слове.
Примеры
iex> Keyword.merge([a: 1, b: 2], [a: 3, d: 4]) [b: 2, a: 3, d: 4] iex> Keyword.merge([a: 1, b: 2], [a: 3, d: 4, a: 5]) [b: 2, a: 3, d: 4, a: 5] iex> Keyword.merge([a: 1], [2, 3]) ** (ArgumentError) expected a keyword list as the second argument, got: [2, 3]
merge(keywords1, keywords2, fun)
Спецификации
merge(t(), t(), (key(), value(), value() -> value())) :: t()
Объединяет два списка ключевых слов в один.
Все ключи, включая дубликаты, указанные в keywords2, будут добавлены к keywords1. Заданная функция будет вызвана для решения конфликтов.
Если keywords2 имеет дубликаты ключей, заданная функция будет вызвана для каждой совпадающей пары в keywords1.
Нет гарантий относительно порядка ключей в возвращаемом ключевом слове.
Примеры
iex> Keyword.merge([a: 1, b: 2], [a: 3, d: 4], fn _k, v1, v2 -> ...> v1 + v2 ...> end) [b: 2, a: 4, d: 4] iex> Keyword.merge([a: 1, b: 2], [a: 3, d: 4, a: 5], fn :a, v1, v2 -> ...> v1 + v2 ...> end) [b: 2, a: 4, d: 4, a: 5] iex> Keyword.merge([a: 1, b: 2, a: 3], [a: 3, d: 4, a: 5], fn :a, v1, v2 -> ...> v1 + v2 ...> end) [b: 2, a: 4, d: 4, a: 8] iex> Keyword.merge([a: 1, b: 2], [:a, :b], fn :a, v1, v2 -> ...> v1 + v2 ...> end) ** (ArgumentError) expected a keyword list as the second argument, got: [:a, :b]
new()
Спецификации
new() :: []
Возвращает пустой список ключевых слов, т.е. пустой список.
Примеры
iex> Keyword.new() []
new(pairs)
Спецификации
new(Enum.t()) :: t()
Создает список ключевых слов из перечислимого объекта.
Дубликаты записей удаляются, последняя запись сохраняется. В отличие от Enum.into(enumerable, []), Keyword.new(enumerable) гарантирует уникальность ключей.
Примеры
iex> Keyword.new([{:b, 1}, {:a, 2}])
[b: 1, a: 2]
iex> Keyword.new([{:a, 1}, {:a, 2}, {:a, 3}])
[a: 3] new(pairs, transform)
Спецификации
new(Enum.t(), (term() -> {key(), value()})) :: t() Создает список ключевых слов из перечислимого объекта с помощью функции преобразования.
Дубликаты записей удаляются, последняя запись сохраняется. В отличие от Enum.into(enumerable, [], fun), Keyword.new(enumerable, fun) гарантирует уникальность ключей.
Примеры
iex> Keyword.new([:a, :b], fn x -> {x, x} end)
[a: :a, b: :b] pop(keywords, key, default \\ nil)
Спецификации
pop(t(), key(), value()) :: {value(), t()} Возвращает первое значение для key и удаляет все связанные записи в списке ключевых слов.
Возвращает кортеж, где первый элемент — первое значение для key, а второй элемент — список ключевых слов со всеми записями, связанными с key, удаленными. Если key отсутствует в списке ключевых слов, возвращается {default, keyword_list}.
Если вы не хотите удалять все записи, связанные с key, используйте pop_first/3 вместо этого, эта функция удалит только первую запись.
Примеры
iex> Keyword.pop([a: 1], :a)
{1, []}
iex> Keyword.pop([a: 1], :b)
{nil, [a: 1]}
iex> Keyword.pop([a: 1], :b, 3)
{3, [a: 1]}
iex> Keyword.pop([a: 1, a: 2], :a)
{1, []} pop_first(keywords, key, default \\ nil)
Спецификации
pop_first(t(), key(), value()) :: {value(), t()} Возвращает и удаляет первое значение, связанное с key в списке ключевых слов.
Дублированные ключи не удаляются.
Примеры
iex> Keyword.pop_first([a: 1], :a)
{1, []}
iex> Keyword.pop_first([a: 1], :b)
{nil, [a: 1]}
iex> Keyword.pop_first([a: 1], :b, 3)
{3, [a: 1]}
iex> Keyword.pop_first([a: 1, a: 2], :a)
{1, [a: 2]} pop_lazy(keywords, key, fun)
Спецификации
pop_lazy(t(), key(), (() -> value())) :: {value(), t()} Лениво возвращает и удаляет все значения, связанные с key в списке ключевых слов.
Это полезно, если значение по умолчанию очень дорого вычисляется или, в общем случае, сложно настроить и снести заново.
Все дублированные ключи удаляются. См. pop_first/3 для удаления только первой записи.
Примеры
iex> keyword = [a: 1]
iex> fun = fn ->
...> # some expensive operation here
...> 13
...> end
iex> Keyword.pop_lazy(keyword, :a, fun)
{1, []}
iex> Keyword.pop_lazy(keyword, :b, fun)
{13, [a: 1]} put(keywords, key, value)
Спецификации
put(t(), key(), value()) :: t()
Помещает заданное value под key.
Если ранее хранилось значение, все записи удаляются, и значение перезаписывается.
Примеры
iex> Keyword.put([a: 1], :b, 2) [b: 2, a: 1] iex> Keyword.put([a: 1, b: 2], :a, 3) [a: 3, b: 2] iex> Keyword.put([a: 1, b: 2, a: 4], :a, 3) [a: 3, b: 2]
put_new(keywords, key, value)
Спецификации
put_new(t(), key(), value()) :: t()
Помещает заданное value под key только в том случае, если запись key уже не существует.
Примеры
iex> Keyword.put_new([a: 1], :b, 2) [b: 2, a: 1] iex> Keyword.put_new([a: 1, b: 2], :a, 3) [a: 1, b: 2]
put_new_lazy(keywords, key, fun)
Спецификации
put_new_lazy(t(), key(), (() -> value())) :: t()
Вычисляет fun и помещает результат под key в списке ключевых слов, только если key отсутствует.
Это полезно, если значение очень дорого вычисляется или, в общем случае, сложно настроить и снести заново.
Примеры
iex> keyword = [a: 1] iex> fun = fn -> ...> # some expensive operation here ...> 3 ...> end iex> Keyword.put_new_lazy(keyword, :a, fun) [a: 1] iex> Keyword.put_new_lazy(keyword, :b, fun) [b: 3, a: 1]
replace!(keywords, key, value)
Спецификации
replace!(t(), key(), value()) :: t()
Изменяет значение, хранящееся под key на value, но только если запись key уже существует в keywords.
Если key отсутствует в keywords, возникает исключение KeyError.
Примеры
iex> Keyword.replace!([a: 1, b: 2, a: 4], :a, 3) [a: 3, b: 2] iex> Keyword.replace!([a: 1], :b, 2) ** (KeyError) key :b not found in: [a: 1]
split(keywords, keys)
Спецификации
split(t(), [key()]) :: {t(), t()} Берет все записи, соответствующие заданным ключам, и извлекает их в отдельный список ключевых слов.
Возвращает кортеж с новым списком и старым списком со удаленными ключами.
Ключи, для которых нет записей в списке ключевых слов, игнорируются.
Записи с дублированными ключами попадают в один и тот же список ключевых слов.
Примеры
iex> Keyword.split([a: 1, b: 2, c: 3], [:a, :c, :e])
{[a: 1, c: 3], [b: 2]}
iex> Keyword.split([a: 1, b: 2, c: 3, a: 4], [:a, :c, :e])
{[a: 1, c: 3, a: 4], [b: 2]} take(keywords, keys)
Спецификации
take(t(), [key()]) :: t()
Берет все записи, соответствующие заданным ключам, и возвращает их в новом списке ключевых слов.
Дублированные ключи сохраняются в новом списке ключевых слов.
Примеры
iex> Keyword.take([a: 1, b: 2, c: 3], [:a, :c, :e]) [a: 1, c: 3] iex> Keyword.take([a: 1, b: 2, c: 3, a: 5], [:a, :c, :e]) [a: 1, c: 3, a: 5]
to_list(keyword)
Спецификации
to_list(t()) :: t()
Возвращает сам список ключевых слов.
Примеры
iex> Keyword.to_list(a: 1) [a: 1]
update(keywords, key, initial, fun)
Спецификации
update(t(), key(), value(), (value() -> value())) :: t()
Обновляет key в keywords с помощью заданной функции.
Если key не существует, вставляет заданное initial значение.
Если есть дублированные ключи, они все удаляются, и обновляется только первый.
Примеры
iex> Keyword.update([a: 1], :a, 13, &(&1 * 2)) [a: 2] iex> Keyword.update([a: 1, a: 2], :a, 13, &(&1 * 2)) [a: 2] iex> Keyword.update([a: 1], :b, 11, &(&1 * 2)) [a: 1, b: 11]
update!(keywords, key, fun)
Спецификации
update!(t(), key(), (value() -> value())) :: t()
Обновляет key с помощью заданной функции.
Если key не существует, возникает KeyError.
Если есть дублированные ключи, они все удаляются, и обновляется только первый.
Примеры
iex> Keyword.update!([a: 1], :a, &(&1 * 2)) [a: 2] iex> Keyword.update!([a: 1, a: 2], :a, &(&1 * 2)) [a: 2] iex> Keyword.update!([a: 1], :b, &(&1 * 2)) ** (KeyError) key :b not found in: [a: 1]
values(keywords)
Спецификации
values(t()) :: [value()]
Возвращает все значения из списка ключевых слов.
Значения из дублированных ключей будут сохранены в окончательном списке значений.
Примеры
iex> Keyword.values(a: 1, b: 2) [1, 2] iex> Keyword.values(a: 1, b: 2, a: 3) [1, 2, 3]
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.9.4/Keyword.html