D-programming-mixins
Dプログラミング-Mixins
ミックスインは、生成されたコードをソースコードに混合できる構造体です。 ミックスインは次のタイプにすることができます-
- ストリングミックスイン
- テンプレートミックスイン
- Mixin名前空間
ストリングミックスイン
Dは、文字列がコンパイル時に既知である限り、文字列としてコードを挿入する機能を備えています。 文字列ミックスインの構文は以下に示されています-
mixin (compile_time_generated_string)
例
文字列ミックスインの簡単な例を以下に示します。
import std.stdio;
void main() {
mixin(`writeln("Hello World!");`);
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Hello World!
mixinが関数を使用してコードを再利用できるように、コンパイル時に文字列を渡すことができる別の例を次に示します。 以下に示します。
import std.stdio;
string print(string s) {
return `writeln("` ~ s ~ `");`;
}
void main() {
mixin (print("str1"));
mixin (print("str2"));
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
str1
str2
テンプレートミックスイン
Dテンプレートは、コンパイラがそのパターンから実際のインスタンスを生成するための一般的なコードパターンを定義します。 テンプレートは、関数、構造体、共用体、クラス、インターフェース、およびその他の正当なDコードを生成できます。 テンプレートミックスインの構文は次のとおりです。
mixin a_template!(template_parameters)
文字列ミックスインの簡単な例を以下に示します。ここでは、クラスDepartmentを持つテンプレートを作成し、テンプレートをインスタンス化するミックスインを作成して、構造体カレッジで関数setNameおよびprintNamesを使用できるようにします。
例
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();
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
The names
0 : name1
1 : name2
Mixin名前空間
ミックスインの名前空間は、テンプレートミックスインのあいまいさを避けるために使用されます。 たとえば、2つの変数があり、1つはmainで明示的に定義され、もう1つは混在しています。 混在する名前が周囲のスコープ内の名前と同じ場合、周囲のスコープ内の名前が使用されます。 この例を以下に示します。
例
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();
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
name 1
name 2