Кортеж — это группа из двух или более выражений, которые считаются одним выражением.
Литерал кортежа содержит несколько выражений в ()
, а элементы разделяются запятыми:
(1, 2, 3)
В кортеже имеет значение порядок элементов. Показанный ниже кортеж отличается от предыдущего:
(3, 2, 1)
Также одно и то же выражение может встречаться в нескольких местах кортежа:
("Help me Rhonda", "Help", "Help me Rhonda")
Выражения в кортеже могут относиться к любому из типов и даже иметь разные типы (в отличие от массивов, которые могут содержать элементы только одного типа).
(1, 2.0, "three")
Кортежи могут даже содержать другие кортежи:
(1, (10, 20.0, "thirty"), "three")
Если вы знакомы с этими терминами, то кортеж можно определить так:
- безымянная структура данных с безымянными упорядоченными элементами;
- массив фиксированного размера, в котором все элементы могут быть разного типа.
Кортежи особенно полезны в следующих случаях:
- Возврат нескольких значений функцией.
- Простая группировка на месте, более компактная, чем создание дополнительной отдельной структуры данных с полным описанием (такой как
struct
илиclass
) для многократного использования.
Указание типа «кортеж» для переменной
Чтобы указать для переменной тип «кортеж», используется префикс tuple
перед типами, заключённым в ()
с разделением запятыми:
MyTupleInts : tuple(int, int, int) = (1, 2, 3)
MyTupleMixed : tuple(int, float, string) = (1, 2.0, "three")
MyTupleNested : tuple(int, tuple(int, float, string), string) = (1, (10, 20.0, "thirty"), "three")
Типы кортежа также могут выводиться логически:
MyTupleInts := (1, 2, 3)
MyTupleMixed := (1, 2.0, "three")
MyTupleNested := (1, (10, 20.0, "thirty"), "three")
Спецификаторы типов в кортеже могут использоваться в составляющих данных и сигнатурах типов функций для параметров или типа return:
ExampleFunction(Param1 : tuple(string, int), Param2 : tuple(int, string)), Param3 : tuple(string, int) =
# Использование параметра в качестве результата
Param1
Обращение к элементу кортежа
Обратиться к элементам кортежа можно с помощью оператора индекса, который возвращает результат в любом случае, начинает отсчёт с нуля и принимает значение целого числа. Оператор индекса возвращает результат в любом случае (в отличие от оператора индекса массива [index]
, который может не вернуть результат), потому что компилятор всегда знает количество элементов любого кортежа, и поэтому любой выходящий за пределы индекс будет являться ошибкой времени компиляции:
MyTuple := (1, 2.0, "three")
MyNestedTuple := (1, (10, 20.0, "thirty"), "three")
var MyInt: int = MyTuple(0)
var MyFloat: float = MyTuple(1)
var MyString: string = MyTuple(2)
Print("Мои переменные: {MyInt}, {MyFloat}, {MyString}")
Print("Мой элемент вложенного кортежа: {MyNestedTuple(1)(2)}")
Приведение кортежа к массиву
Кортежи можно передавать всегда, когда ожидается массив, при условии, что тип элементов кортежа совпадает с типом массива. При этом передавать массивы там, где ожидается кортеж, нельзя.
Развёртывание кортежа
Когда кортеж передаётся в качестве единственного элемента функции, это выглядит так, как если бы функция вызывалась с каждым из элементов этого кортежа по отдельности. Это называется развёртыванием или распаковкой кортежа.
F(Arg1 : int, Arg2 : string) : void =
DoStuff(Arg1, Arg2)
G() : void =
MyTuple := (1, "two")
F(MyTuple(0), MyTuple(1)) # Элементы, к которым мы обращаемся
F(MyTuple) # Развёртывание кортежа
Выражение со структурированной конкурентностью sync
имеет кортеж result, который позволяет рассчитывать одновременно несколько аргументов. Дополнительную информацию см. в разделе Конкурентность.
Сохраняемый тип
Кортеж является сохраняемым, если типы каждого элемента в кортеже являются сохраняемыми. «Кортеж является сохраняемым» означает, что вы можете использовать их в переменных weak_map
, входящих в область видимости модуля, и их значения будут сохраняться в течение всех игровых сессий. Подробнее о сохраняемых элементах в Verse см. в статье Использование сохраняемых данных в Verse.