D Programmierung - Mixins
Mixins sind Strukturen, mit denen der generierte Code in den Quellcode gemischt werden kann. Mixins können von den folgenden Typen sein -
- String Mixins
- Template Mixins
- Namensräume mischen
String Mixins
D kann Code als Zeichenfolge einfügen, solange diese Zeichenfolge zur Kompilierungszeit bekannt ist. Die Syntax von String-Mixins ist unten dargestellt -
mixin (compile_time_generated_string)
Beispiel
Ein einfaches Beispiel für String-Mixins ist unten dargestellt.
import std.stdio;
void main() {
mixin(`writeln("Hello World!");`);
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
Hello World!
Hier ist ein weiteres Beispiel, in dem wir die Zeichenfolge in der Kompilierungszeit übergeben können, damit Mixins die Funktionen zur Wiederverwendung von Code verwenden können. Es ist unten gezeigt.
import std.stdio;
string print(string s) {
return `writeln("` ~ s ~ `");`;
}
void main() {
mixin (print("str1"));
mixin (print("str2"));
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
str1
str2
Template Mixins
D-Vorlagen definieren allgemeine Codemuster, damit der Compiler aus diesem Muster tatsächliche Instanzen generiert. Die Vorlagen können Funktionen, Strukturen, Gewerkschaften, Klassen, Schnittstellen und jeden anderen legalen D-Code generieren. Die Syntax von Template-Mixins ist wie folgt.
mixin a_template!(template_parameters)
Ein einfaches Beispiel für String-Mixins wird unten gezeigt, wo wir eine Vorlage mit der Klassenabteilung und einem Mixin erstellen, die eine Vorlage instanziieren und somit die Funktionen setName und printNames für das Struktur-College verfügbar machen.
Beispiel
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();
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
The names
0 : name1
1 : name2
Mixin Namensräume
Mixin-Namensräume werden verwendet, um Mehrdeutigkeiten in Vorlagen-Mixins zu vermeiden. Beispielsweise kann es zwei Variablen geben, von denen eine explizit in main definiert und die andere eingemischt ist. Wenn ein eingemischter Name mit einem Namen im umgebenden Bereich identisch ist, wird der Name im umgebenden Bereich abgerufen gebraucht. Dieses Beispiel ist unten dargestellt.
Beispiel
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();
}
Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:
name 1
name 2