位置:首頁 > 高級語言 > D語言教學 > D語言混合類型

D語言混合類型

混合類型的結構,使所生成的代碼中混合類型的源代碼。混合類型可以是以下類型。

  • String 混合類型

  • Template 混合類型

  • 混合命名空間

String 混合類型

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)

一個簡單的例子字符串混合類型如下所示,我們創建一個類係和一個混合類型實例化一個模板一個模板,從而使得該功能的setName和printNames可用的結構college。

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

混入名稱空間

混入的名稱空間是用來避免在模板中混合類型含糊不清。例如,可以有兩個變量,一個在主顯式定義,而另一個是混合的。當混合在名稱相同的名稱是在周邊範圍內,則認為是在周圍範圍的名稱得到使用。這個例子顯示如下。

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