Programowanie D - krotki

Krotki służą do łączenia wielu wartości w jeden obiekt. Krotki zawierają sekwencję elementów. Elementami mogą być typy, wyrażenia lub aliasy. Liczba i elementy krotki są ustalane w czasie kompilacji i nie można ich zmienić w czasie wykonywania.

Krotki mają cechy zarówno struktur, jak i tablic. Elementy krotki mogą być różnych typów, takich jak struktury. Dostęp do elementów można uzyskać poprzez indeksowanie, podobnie jak tablice. Są one implementowane jako funkcja biblioteki przez szablon Tuple z modułu std.typecons. Tuple korzysta z TypeTuple z modułu std.typetuple dla niektórych swoich operacji.

Tuple Using tuple ()

Krotki można konstruować za pomocą funkcji tuple (). Dostęp do elementów członkowskich krotki uzyskuje się za pomocą wartości indeksu. Przykład jest pokazany poniżej.

Przykład

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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

Krotka przy użyciu szablonu krotki

Krotkę można również skonstruować bezpośrednio za pomocą szablonu krotki zamiast funkcji tuple (). Typ i nazwa każdego elementu członkowskiego są określane jako dwa kolejne parametry szablonu. Dostęp do członków można uzyskać za pomocą właściwości, gdy są tworzone przy użyciu szablonów.

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

Gdy powyższy kod jest kompilowany i wykonywany, daje następujący wynik

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

Rozszerzanie parametrów właściwości i funkcji

Składowe krotki można rozszerzyć za pomocą właściwości .expand lub przez wycinanie. Ta rozszerzona / podzielona na plasterki wartość może być przekazana jako lista argumentów funkcji. Przykład jest pokazany poniżej.

Przykład

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

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 jest zdefiniowany w module std.typetuple. Lista wartości i typów oddzielonych przecinkami. Prosty przykład użycia TypeTuple jest podany poniżej. TypeTuple służy do tworzenia listy argumentów, listy szablonów i listy literałów tablicowych.

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

method 1 5 my string 3.3 r 
5     6