Programação D - Tuplas

Tuplas são usadas para combinar vários valores como um único objeto. Tuplas contém uma sequência de elementos. Os elementos podem ser tipos, expressões ou aliases. O número e os elementos de uma tupla são fixos em tempo de compilação e não podem ser alterados em tempo de execução.

As tuplas têm características tanto de estruturas quanto de matrizes. Os elementos da tupla podem ser de diferentes tipos, como estruturas. Os elementos podem ser acessados ​​por meio de indexação como matrizes. Eles são implementados como um recurso de biblioteca pelo modelo Tuple do módulo std.typecons. Tuple usa TypeTuple do módulo std.typetuple para algumas de suas operações.

Tupla usando tupla ()

Tuplas podem ser construídas pela função tupla (). Os membros de uma tupla são acessados ​​por valores de índice. Um exemplo é mostrado abaixo.

Exemplo

import std.stdio; 
import std.typecons; 
 
void main() { 
   auto myTuple = tuple(1, "Tuts"); 
   writeln(myTuple); 
   writeln(myTuple[0]); 
   writeln(myTuple[1]); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Tuple!(int, string)(1, "Tuts") 
1 
Tuts

Tupla usando modelo de tupla

A tupla também pode ser construída diretamente pelo modelo Tupla em vez da função tupla (). O tipo e o nome de cada membro são especificados como dois parâmetros de modelo consecutivos. É possível acessar os membros por propriedades quando criados usando modelos.

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); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado

Tuple!(int, "id", string, "value")(1, "Tuts") 
by index 0 : 1 
by .id : 1 
by index 1 : Tuts 
by .value Tuts

Expandindo parâmetros de propriedade e função

Os membros da Tupla podem ser expandidos pela propriedade .expand ou por fracionamento. Este valor expandido / fatiado pode ser passado como lista de argumentos de função. Um exemplo é mostrado abaixo.

Exemplo

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..$]); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

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 é definido no módulo std.typetuple. Uma lista de valores e tipos separados por vírgulas. Um exemplo simples usando TypeTuple é fornecido abaixo. TypeTuple é usado para criar lista de argumentos, lista de modelos e lista literal de array.

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);  
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

method 1 5 my string 3.3 r 
5     6