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