D 程式設計 - Mixin



Mixin 是允許將生成的程式碼混合到原始碼中的結構體。Mixin 可以是以下型別:

  • 字串 Mixin
  • 模板 Mixin
  • Mixin 名稱空間

字串 Mixin

D 具有在編譯時插入字串程式碼的能力,只要該字串在編譯時已知。字串 Mixin 的語法如下所示:

mixin (compile_time_generated_string)

示例

下面顯示了一個字串 Mixin 的簡單示例。

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

模板 Mixin

D 模板定義了通用的程式碼模式,編譯器可以根據該模式生成實際的例項。模板可以生成函式、結構體、聯合體、類、介面以及任何其他合法的 D 程式碼。模板 Mixin 的語法如下所示。

mixin a_template!(template_parameters)

下面顯示了一個字串 Mixin 的簡單示例,我們使用類 Department 建立一個模板,並使用一個 Mixin 例項化該模板,從而使函式 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 

Mixin 名稱空間

Mixin 名稱空間用於避免模板 Mixin 中的歧義。例如,可能存在兩個變數,一個在 main 中顯式定義,另一個是混合的。當混合的名稱與周圍作用域中的名稱相同時,將使用周圍作用域中的名稱。此示例如下所示。

示例

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
廣告
© . All rights reserved.