Spec-Zone.ru › Elixir 1.6

Кортежи

Функции для работы с кортежами.

Кортежи — это составные типы данных с фиксированным количеством элементов. Кортежи могут содержать элементы любого типа, и кортеж может содержать элементы разных типов. Для создания кортежей можно использовать фигурные скобки:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API