D-programming-mixins

提供:Dev Guides
移動先:案内検索

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