Programmazione D - Tuple
Le tuple vengono utilizzate per combinare più valori come un singolo oggetto. Le tuple contengono una sequenza di elementi. Gli elementi possono essere tipi, espressioni o alias. Il numero e gli elementi di una tupla vengono fissati in fase di compilazione e non possono essere modificati in fase di esecuzione.
Le tuple hanno caratteristiche sia di strutture che di array. Gli elementi della tupla possono essere di diversi tipi come gli struct. È possibile accedere agli elementi tramite indicizzazione come array. Sono implementati come funzionalità di libreria dal modello Tuple dal modulo std.typecons. Tuple fa uso di TypeTuple dal modulo std.typetuple per alcune delle sue operazioni.
Tupla utilizzando tuple ()
Le tuple possono essere costruite dalla funzione tuple (). Ai membri di una tupla si accede tramite valori di indice. Di seguito è mostrato un esempio.
Esempio
import std.stdio;
import std.typecons;
void main() {
auto myTuple = tuple(1, "Tuts");
writeln(myTuple);
writeln(myTuple[0]);
writeln(myTuple[1]);
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Tuple!(int, string)(1, "Tuts")
1
Tuts
Tupla utilizzando il modello di tupla
Tuple può anche essere costruita direttamente dal template Tuple invece che dalla funzione tuple (). Il tipo e il nome di ogni membro vengono specificati come due parametri di modello consecutivi. È possibile accedere ai membri in base alle proprietà quando vengono creati utilizzando i modelli.
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 il codice precedente viene compilato ed eseguito, produce il risultato seguente
Tuple!(int, "id", string, "value")(1, "Tuts")
by index 0 : 1
by .id : 1
by index 1 : Tuts
by .value Tuts
Espansione dei parametri di proprietà e funzione
I membri di Tuple possono essere espansi dalla proprietà .expand o dall'affettamento. Questo valore espanso / suddiviso può essere passato come elenco di argomenti della funzione. Di seguito è mostrato un esempio.
Esempio
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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:
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 è definito nel modulo std.typetuple. Un elenco di valori e tipi separati da virgole. Di seguito viene fornito un semplice esempio di utilizzo di TypeTuple. TypeTuple viene utilizzato per creare un elenco di argomenti, un elenco di modelli e un elenco di valori letterali di matrice.
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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:
method 1 5 my string 3.3 r
5 6