D編程 混合(Mixins)

2021-09-01 10:37 更新

Mixins是允許將生成的代碼混合到源代碼中的結(jié)構(gòu), Mixins可以是以下類型-

  • String Mixins
  • Template Mixins
  • Mixin name spaces

字符串混合

只要在編譯時(shí)就知道該字符串,D就可以將代碼作為字符串插入,字符串混合的語法如下所示-

mixin (compile_time_generated_string)

字符串混合的簡(jiǎn)單如下所示。

import std.stdio; 
 
void main() { 
   mixin(`writeln("Hello World!");`); 
}

編譯并執(zhí)行上述代碼后,將產(chǎn)生以下輸出-

Hello World!

這是另一個(gè)示例,我們可以在編譯時(shí)傳遞字符串,以便mixin可以使用函數(shù)來重用代碼。如下所示。

import std.stdio;

string print(string s) {
   return `writeln("` ~ s ~ `");`; 
}
  
void main() { 
   mixin (print("str1")); 
   mixin (print("str2")); 
}

編譯并執(zhí)行上述代碼后,將產(chǎn)生以下輸出-

str1
str2

模板混合

D模板定義了通用的代碼模式,供編譯器從該模式生成實(shí)際,模板可以生成函數(shù),結(jié)構(gòu),聯(lián)合,類,接口和任何其他合法的D代碼。模板mixin的語法如下所示。

mixin a_template!(template_parameters)

下面顯示了一個(gè)字符串mixin的簡(jiǎn)單示例,其中我們使用Department類創(chuàng)建一個(gè)模板,并化一個(gè)template的mixin,從而使結(jié)構(gòu)學(xué)院可以使用setName和printNames函數(shù)。

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(); 
}

編譯并執(zhí)行上述代碼后,將產(chǎn)生以下輸出-

The names 
0 : name1 
1 : name2 

混合名稱空間

混入名稱空間用于避免模板混入中的歧義,如,可以有兩個(gè)變量,一個(gè)在main中顯式定義,另一個(gè)在mixin中,當(dāng)混合名稱與周圍范圍中的名稱相同時(shí),周圍范圍中的名稱將得到用過的。該如下所示。

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(); 
}

編譯并執(zhí)行上述代碼后,將產(chǎn)生以下輸出-

name 1 
name 2


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)