Кортежи
Функции для работы с кортежами.
Кортежи — это составные типы данных с фиксированным количеством элементов. Кортежи могут содержать элементы любого типа, и кортеж может содержать элементы разных типов. Для создания кортежей можно использовать фигурные скобки:
iex> {}
{}
iex> {1, :two, "three"}
{1, :two, "three"}Кортежи хранят элементы непрерывно в памяти. Это означает, что доступ к элементу кортежа по индексу не зависит от количества элементов в кортеже. Мы говорим, что операция выполняется за постоянное время с помощью функции Kernel.elem/1:
iex> tuple = {1, :two, "three"}
iex> elem(tuple, 0)
1
iex> elem(tuple, 2)
"three"То же самое относится к получению размера кортежа с помощью Kernel.tuple_size/1:
iex> tuple_size({})
0
iex> tuple_size({1, 2, 3})
3Кортежи, хранящиеся непрерывно в памяти, также означают, что обновление кортежа (например, замена элемента с помощью Kernel.put_elem/3) создаст поверхностную копию всего кортежа. Элементы кортежа по-прежнему объединены благодаря неизменяемости.
Кортежи не предназначены для использования в качестве типа «коллекции», а скорее как контейнер фиксированного размера для нескольких элементов. Поэтому динамически пройтись по кортежу с помощью функций в модуле Enum невозможно.
Например, кортежи часто используются для возврата «обогащенных» значений: распространённый шаблон — возвращать {:ok, value} в успешных случаях и {:error, reason} в неудачных случаях. Именно это делает File.read/1: он возвращает {:ok, contents} при успешном чтении заданного файла или {:error, reason} в противном случае, например, когда файла не существует.
Наиболее распространённые операции с кортежами доступны в Kernel (Kernel.tuple_size/1, Kernel.elem/2, Kernel.put_elem/3 и другие) и автоматически импортируются в ваш код. Функции в этом модуле охватывают другие случаи, такие как динамическое создание кортежей (Tuple.duplicate/2) и преобразование в список (Tuple.to_list/1). Функции, добавляющие и удаляющие элементы из кортежей, изменяя их размер, редко используются на практике, поскольку обычно подразумевают использование кортежей в качестве коллекций. Даже если у вас есть кортеж {:ok, atom} и вы хотите добавить к нему ещё один элемент, например, пустой массив, предпочтительнее полагаться на сопоставление с образцом и создание нового кортежа, чем на динамическое его изменение:
tuple = {:ok, :example}
# Avoid
Tuple.insert_at(tuple, 2, %{}}
# Prefer
{:ok, atom} = tuple
{:ok, atom, %{}}Краткое описание
Функции
- append(tuple, value)
Вставляет элемент в конец кортежа
- delete_at(tuple, index)
Удаляет элемент из кортежа
- duplicate(data, size)
Создаёт новый кортеж
- insert_at(tuple, index, value)
Вставляет элемент в кортеж
- to_list(tuple)
Преобразует кортеж в список
Функции
append(tuple, value)
append(tuple(), term()) :: tuple()
Вставляет элемент в конец кортежа.
Возвращает новый кортеж с добавленным элементом в конец, содержащий элементы в tuple и value в качестве последнего элемента.
Встраивается компилятором.
Примеры
iex> tuple = {:foo, :bar}
iex> Tuple.append(tuple, :baz)
{:foo, :bar, :baz}delete_at(tuple, index)
delete_at(tuple(), non_neg_integer()) :: tuple()
Удаляет элемент из кортежа.
Удаляет элемент по заданному index из tuple. Вызывает исключение ArgumentError, если index отрицательное или больше или равно длине tuple. Индекс нулевой.
Встраивается компилятором.
Примеры
iex> tuple = {:foo, :bar, :baz}
iex> Tuple.delete_at(tuple, 0)
{:bar, :baz}duplicate(data, size)
duplicate(term(), non_neg_integer()) :: tuple()
Создаёт новый кортеж.
Создаёт кортеж size, содержащий заданное data на каждой позиции.
Встраивается компилятором.
Примеры
iex> Tuple.duplicate(:hello, 3)
{:hello, :hello, :hello}insert_at(tuple, index, value)
insert_at(tuple(), non_neg_integer(), term()) :: tuple()
Вставляет элемент в кортеж.
Вставляет value в tuple по заданному index. Вызывает исключение ArgumentError, если index отрицательное или больше длины tuple. Индекс нулевой.
Встраивается компилятором.
Примеры
iex> tuple = {:bar, :baz}
iex> Tuple.insert_at(tuple, 0, :foo)
{:foo, :bar, :baz}
iex> Tuple.insert_at(tuple, 2, :bong)
{:bar, :baz, :bong}to_list(tuple)
to_list(tuple()) :: list()
Преобразует кортеж в список.
Возвращает новый список со всеми элементами кортежа.
Встраивается компилятором.
Примеры
iex> tuple = {:foo, :bar, :baz}
iex> Tuple.to_list(tuple)
[:foo, :bar, :baz]
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.6.6/Tuple.html