Кортежи используются для объединения нескольких значений в виде одного объекта. Кортежи содержат последовательность элементов. Элементы могут быть типами, выражениями или псевдонимами. Элементы кортежа и их количество фиксируются во время компиляции, и их нельзя изменить во время выполнения.
Кортежи имеют свойства, похожие на свойства как структур, так и массивов.
Элементы кортежа могут быть разных типов, так же, как в структуре.
Доступ к элементам можно получить посредством индексирования, как в массиве.
Они реализованы в стандартной библиотеке с помощью шаблона Tuple из модуля std.typecons.
Tuple использует TypeTuple из модуля std.typetuple для некоторых своих операций.
(Сейчас модуль std.typetuple практически пуст, только публично импортирует модуль std.meta,
тип TypeTuple в нём есть, но сейчас является псевдонимом типа AliasSeq,
вроде бы их переименовали для уменьшения путаницы – прим. пер.)
Кортежи можно создавать с помощью функции tuple(). Обращение к элементам кортежа происходит по значению индекса. Пример показан ниже.
import std.stdio; import std.typecons; void main() { auto myTuple = tuple(1, "Tuts"); writeln(myTuple); writeln(myTuple[0]); writeln(myTuple[1]); }
When the above code is compiled and executed, it produces the following result −
Tuple!(int, string)(1, "Tuts") 1 Tuts
Кортеж также можно создавать непосредственно через шаблон Tuple вместо функции tuple(). Тип и имя каждого элемента указываются в виде двух последовательных параметров шаблона. При создании кортежа с помощью шаблона можно получить доступ к элементам через свойства.
import std.stdio; import std.typecons; void main() { auto myTuple = Tuple!(int, "id",string, "value")(1, "Tuts"); writeln(myTuple); writeln("по индексу 0 : ", myTuple[0]); writeln("через свойство .id : ", myTuple.id); writeln("по индексу 1 : ", myTuple[1]); writeln("через свойство .value ", myTuple.value); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Tuple!(int, "id", string, "value")(1, "Tuts") по индексу 0 : 1 через свойство .id : 1 по индексу 1 : Tuts через свойство .value Tuts
Члены кортежа можно раскрыть либо с помощью свойства .expand, либо через операцию среза. Это раскрытое/нарезанное значение можно передавать в качестве списка аргументов функции. Пример показан ниже.
import std.stdio; import std.typecons; void method1(int a, string b, float c, char d) { writeln("method1 ",a,"\t",b,"\t",c,"\t",d); } void method2(int a, float b, char c) { writeln("method2 ",a,"\t",b,"\t",c); } void main() { auto myTuple = tuple(5, "моя строка", 3.3, 'r'); writeln("method1 вызов 1"); method1(myTuple[]); writeln("method1 вызов 2"); method1(myTuple.expand); writeln("method2 вызов 1"); method2(myTuple[0], myTuple[$-2..$]); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
method1 вызов 1 method1 5 моя строка 3.3 r method1 вызов 2 method1 5 моя строка 3.3 r method2 вызов 1 method2 5 3.3 r
Кортеж TypeTuple определяется в модуле std.typetuple. Список значений и типов, разделенных запятыми. Ниже приведен простой пример использования TypeTuple. TypeTuple используется для создания списка аргументов, шаблонного списка, и списка литералов массива.
import std.stdio; import std.typecons; import std.typetuple; alias TypeTuple!(int, long) TL; void method1(int a, string b, float c, char d) { writeln("method1 ",a,"\t",b,"\t",c,"\t",d); } void method2(TL tl) { writeln(tl[0],"\t", tl[1] ); } void main() { auto arguments = TypeTuple!(5, "моя строка", 3.3,'r'); method1(arguments); method2(5, 6L); }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
method1 5 моя строка 3.3 r 5 6