Bootstrap

Кортеж (tuple)

Кортеж (tuple)

? Модуль `Tuple`

> Кортеж (tuple) — это фиксированный по размеру, неизменяемый контейнер,

> где элементы могут быть любыми типами.

>

> Пример: {1, :ok, "hi"}


? Создание и базовые операции

Функция / конструкцияНазначениеПример
{}Литерал кортежа{1, 2, 3}
tuple_size/1 (Kernel)Кол-во элементовtuple_size({:a, :b}) #=> 2
is_tuple/1 (Kernel)Проверка типаis_tuple({1,2}) #=> true
put_elem/3 (Kernel)Заменить элемент по индексу (0-based)put_elem({:a,:b,:c}, 1, :x) #=> {:a,:x,:c}
elem/2 (Kernel)Получить элемент по индексуelem({:a,:b,:c}, 2) #=> :c
Tuple.duplicate/2Создать кортеж, повторив элемент N разTuple.duplicate(:ok, 3) #=> {:ok, :ok, :ok}
Tuple.insert_at/3Вставить элемент по индексуTuple.insert_at({:a,:c}, 1, :b) #=> {:a,:b,:c}
Tuple.delete_at/2Удалить элемент по индексуTuple.delete_at({:a,:b,:c}, 1) #=> {:a,:c}

? Преобразование

ФункцияНазначениеПример
Tuple.to_list/1Преобразовать в списокTuple.to_list({:a,:b,:c}) #=> [:a,:b,:c]
List.to_tuple/1Список → кортежList.to_tuple([1,2,3]) #=> {1,2,3}
Enum.into/2Преобразование коллекции в кортежEnum.into([1,2,3], {}) #=> {1,2,3}
Enum.to_list/1Для работы с элементами (через список)Enum.map(Tuple.to_list({1,2,3}), &(&1*2)) #=> [2,4,6]

? Извлечение и обновление (паттерн-матчинг)

Конструкция / функцияНазначениеПример
{a, b} = {1, 2}Распаковка кортежаa #=> 1, b #=> 2
{a, _, c} = {1, :skip, 3}Игнорирование элементов_ пропускает элемент
elem/2Получить по индексуelem({10,20,30}, 1) #=> 20
put_elem/3Обновить по индексуput_elem({1,2,3}, 0, 99) #=> {99,2,3}
{tag, val}Часто используется для pattern match (:ok / :error)case File.read("x") do {:ok, data} -> ...; {:error, r} -> ... end

? Проверка и информация

ФункцияНазначениеПример
is_tuple/1Проверка, что значение — кортежis_tuple({1,2}) #=> true
tuple_size/1Кол-во элементовtuple_size({:a,:b,:c}) #=> 3
Kernel.match?/2Проверка на соответствие шаблонуmatch?({:ok, _}, {:ok, 123}) #=> true

? Слияние и объединение

ФункцияНазначениеПример
Tuple.append/2 (нет в Elixir, но можно через insert_at)Добавить в конецTuple.insert_at({:a,:b}, 2, :c) #=> {:a,:b,:c}
Tuple.concat/2 (через List)Объединить кортежиList.to_tuple(Tuple.to_list({:a,:b}) ++ Tuple.to_list({:c})) #=> {:a,:b,:c}

? Пример комплексного использования

Terminal:

# создание и обновление
user = {:user, "Alice", 30}
user = put_elem(user, 2, 31)
# => {:user, "Alice", 31}

# доступ к элементам
name = elem(user, 1)  # "Alice"

# преобразование в список
Tuple.to_list(user)
# => [:user, "Alice", 31]

# работа через паттерн матчинг
{:user, name, age} = user
IO.puts("#{name} is #{age}")
# Alice is 31

? Частые идиомы

ЦельПример
Возврат результата операции{:ok, result} / {:error, reason}
Возврат нескольких значений{sum, count}
Использование как immutable структурыuser = {:user, "Bob", 25}
Конвертация в список для обходаTuple.to_list(t) | > Enum.map(...)

? Kernel-функции, работающие с tuple

ФункцияНазначениеПример
is_tuple/1Проверка типаis_tuple({})
elem/2Получение по индексуelem({:x,:y}, 1)
put_elem/3Изменение по индексуput_elem({:x,:y}, 1, :z)
tuple_size/1Кол-во элементовtuple_size({1,2,3})

? Преобразование через `Enum`

ФункцияНазначениеПример
Enum.map(Tuple.to_list(t), f)Обработка элементовEnum.map(Tuple.to_list({1,2,3}), &(&1*2)) #=> [2,4,6]
Enum.into/2Создать кортежEnum.into([:a,:b,:c], {}) #=> {:a,:b,:c}
Enum.count/1Подсчитать элементыEnum.count(Tuple.to_list({:a,:b})) #=> 2

⚙️ Итого

КатегорияОсновные функции
Создание{}, Tuple.duplicate/2
Проверкаis_tuple/1, tuple_size/1
Доступ / обновлениеelem/2, put_elem/3, Tuple.insert_at/3, Tuple.delete_at/2
ПреобразованиеTuple.to_list/1, List.to_tuple/1
Комбинированиечерез Tuple.to_list + ++
Pattern matching{a, b, c} = tuple

Основные отличия между List и Tuple в Elixir

В Elixir как и в других языках программирования, List и Tuple представляют собой коллекции, но имеют разные характеристики и случаи использования. Рассмотрим их основные отличия.


Сравнение List и Tuple

ХарактеристикаListTuple
ИзменяемостьИзменяемая (mutable)Неизменяемая (immutable)
ПроизводительностьМедленнее для доступа и измененияБыстрее для доступа
Использование памятиИспользует больше памятиИспользует меньше памяти
СтруктураЭлементы могут быть разного типаЭлементы могут быть разного типа, но фиксированы по количеству
КонкатенацияЛегко объединять через ++Нет встроенной функции для объединения
ИндексацияИндексация начинается с 0Индексация начинается с 0
ИспользованиеЧасто используется при работе с последовательными даннымиПодходит для фиксированных наборов данных

Примеры использования

  1. Списки: ``elixir my_list = [1, 2, 3, 4] updated_list = [0 | my_list] # Добавляет 0 в начало списка ``
  2. Кортежи: ``elixir my_tuple = {:ok, "Hello"} ` Обращение к элементам по индексу: `elixir status = elem(my_tuple, 0) # Получает :ok ``

Когда использовать?

  • Списки лучше использовать, когда вам нужно работать с динамической коллекцией элементов, которую нужно часто изменять.
  • Кортежи предпочтительны, когда вы знаете количество элементов заранее и хотите обеспечить быстрое обращение к элементам, например, в случаях, когда вы возвращаете несколько значений из функции.

Эти различия помогают эффективно выбирать между List и Tuple в зависимости от вашей задачи в Elixir.

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

крипто-донат, на развитие сайта itdid.ru:

В новом окне с терминалом itdid.ru, введите любую сумму: