Кортежи


Предыдущая страница
Следующая страница  

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

Кортежи имеют свойства, похожие на свойства как структур, так и массивов. Элементы кортежа могут быть разных типов, так же, как в структуре. Доступ к элементам можно получить посредством индексирования, как в массиве. Они реализованы в стандартной библиотеке с помощью шаблона Tuple из модуля std.typecons. Tuple использует TypeTuple из модуля std.typetuple для некоторых своих операций.
(Сейчас модуль std.typetuple практически пуст, только публично импортирует модуль std.meta, тип TypeTuple в нём есть, но сейчас является псевдонимом типа AliasSeq, вроде бы их переименовали для уменьшения путаницы – прим. пер.)

Создание кортежа с помощью tuple()

Кортежи можно создавать с помощью функции 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 вместо функции 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 и параметры функций

Члены кортежа можно раскрыть либо с помощью свойства .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

Кортеж 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

Предыдущая страница
Следующая страница