Кортежи используются для объединения нескольких значений в один объект. Кортежи содержат последовательность элементов. Элементы могут быть типами, выражениями или псевдонимами. Число и элементы кортежа фиксируются во время компиляции и не могут быть изменены во время выполнения.
Кортежи имеют характеристики как структур, так и массивов. Элементы кортежа могут быть разных типов, например структуры. Доступ к элементам осуществляется через индексирование, как в массивах. Они реализованы как библиотечная функция с помощью шаблона Tuple из модуля std.typecons. Tuple использует TypeTuple из модуля std.typetuple для некоторых своих операций.
Tuple Использование tuple ()
Кортежи могут быть созданы функцией tuple (). Доступ к членам кортежа осуществляется через значения индекса. Пример показан ниже.
пример
import std.stdio; import std.typecons; void main() { auto myTuple = tuple(1, "Tuts"); writeln(myTuple); writeln(myTuple[0]); writeln(myTuple[1]); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Tuple!(int, string)(1, "Tuts") 1 Tuts
Кортеж с использованием шаблона кортежа
Кортеж также может быть создан непосредственно по шаблону кортежа вместо функции tuple (). Тип и имя каждого члена указываются в виде двух последовательных параметров шаблона. Доступ к элементам по свойствам возможен при создании с использованием шаблонов.
import std.stdio; import std.typecons; void main() { auto myTuple = Tuple!(int, "id",string, "value")(1, "Tuts"); writeln(myTuple); writeln("by index 0 : ", myTuple[0]); writeln("by .id : ", myTuple.id); writeln("by index 1 : ", myTuple[1]); writeln("by .value ", myTuple.value); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат
Tuple!(int, "id", string, "value")(1, "Tuts") by index 0 : 1 by .id : 1 by index 1 : Tuts by .value Tuts
Расширение свойств и параметров функций
Члены Tuple могут быть расширены либо с помощью свойства .expand, либо путем нарезки. Это расширенное / нарезанное значение может быть передано как список аргументов функции. Пример показан ниже.
пример
import std.stdio; import std.typecons; void method1(int a, string b, float c, char d) { writeln("method 1 ",a,"\t",b,"\t",c,"\t",d); } void method2(int a, float b, char c) { writeln("method 2 ",a,"\t",b,"\t",c); } void main() { auto myTuple = tuple(5, "my string", 3.3, 'r'); writeln("method1 call 1"); method1(myTuple[]); writeln("method1 call 2"); method1(myTuple.expand); writeln("method2 call 1"); method2(myTuple[0], myTuple[$-2..$]); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
method1 call 1 method 1 5 my string 3.3 r method1 call 2 method 1 5 my string 3.3 r method2 call 1 method 2 5 3.3 r
TypeTuple
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("method 1 ",a,"\t",b,"\t",c,"\t",d); } void method2(TL tl) { writeln(tl[0],"\t", tl[1] ); } void main() { auto arguments = TypeTuple!(5, "my string", 3.3,'r'); method1(arguments); method2(5, 6L); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —