Programmazione D - Mixin
I mixin sono strutture che consentono di mescolare il codice generato nel codice sorgente. I mixin possono essere dei seguenti tipi:
- String Mixins
- Mixin modello
- Mescolare gli spazi dei nomi
String Mixins
D ha la capacità di inserire il codice come stringa fintanto che quella stringa è nota in fase di compilazione. La sintassi dei mixin di stringhe è mostrata di seguito:
mixin (compile_time_generated_string)
Esempio
Di seguito è mostrato un semplice esempio di mixin di archi.
import std.stdio;
void main() {
mixin(`writeln("Hello World!");`);
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Hello World!
Ecco un altro esempio in cui possiamo passare la stringa in fase di compilazione in modo che i mixin possano utilizzare le funzioni per riutilizzare il codice. È mostrato di seguito.
import std.stdio;
string print(string s) {
return `writeln("` ~ s ~ `");`;
}
void main() {
mixin (print("str1"));
mixin (print("str2"));
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
str1
str2
Mixin modello
I modelli D definiscono modelli di codice comuni, affinché il compilatore generi istanze effettive da quel modello. I modelli possono generare funzioni, strutture, unioni, classi, interfacce e qualsiasi altro codice D legale. La sintassi dei template mixin è come mostrato di seguito.
mixin a_template!(template_parameters)
Di seguito viene mostrato un semplice esempio di string mixin dove creiamo un template con la classe Department e un mixin che istanzia un template e quindi rende disponibili alla struttura college le funzioni setName e printNames.
Esempio
import std.stdio;
template Department(T, size_t count) {
T[count] names;
void setName(size_t index, T name) {
names[index] = name;
}
void printNames() {
writeln("The names");
foreach (i, name; names) {
writeln(i," : ", name);
}
}
}
struct College {
mixin Department!(string, 2);
}
void main() {
auto college = College();
college.setName(0, "name1");
college.setName(1, "name2");
college.printNames();
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
The names
0 : name1
1 : name2
Spazi dei nomi di Mixin
Gli spazi dei nomi dei mixin vengono utilizzati per evitare ambiguità nei mixin dei modelli. Ad esempio, possono esserci due variabili, una definita esplicitamente in main e l'altra è mista. Quando un nome misto è uguale a un nome che si trova nello scope circostante, il nome che si trova nello scope circostante viene Usato. Questo esempio è mostrato di seguito.
Esempio
import std.stdio;
template Person() {
string name;
void print() {
writeln(name);
}
}
void main() {
string name;
mixin Person a;
name = "name 1";
writeln(name);
a.name = "name 2";
print();
}
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
name 1
name 2