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