Dプログラミング-ミックスイン
ミックスインは、生成されたコードをソースコードにミックスできるようにする構造体です。ミックスインには次のタイプがあります-
- ストリングミックスイン
- テンプレートミックスイン
- Mixinネームスペース
ストリングミックスイン
Dには、コンパイル時に文字列がわかっている限り、コードを文字列として挿入する機能があります。文字列ミックスインの構文を以下に示します-
mixin (compile_time_generated_string)
例
文字列ミックスインの簡単な例を以下に示します。
import std.stdio;
void main() {
mixin(`writeln("Hello World!");`);
}
上記のコードをコンパイルして実行すると、次の結果が得られます。
Hello World!
コンパイル時に文字列を渡して、ミックスインが関数を使用してコードを再利用できるようにする別の例を次に示します。以下に示します。
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つはメインで明示的に定義され、もう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