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