混合類型的結(jié)構(gòu),使所生成的代碼中混合類型的源代碼?;旌项愋涂梢允且韵骂愋?。
String 混合類型
Template 混合類型
混合命名空間
D語言有字符串在編譯時插入代碼串的能力。字符串混合類型的語法如下所示。
mixin (compile_time_generated_string)
一個簡單字符串混合類型的例子如下所示。
import std.stdio; void main() { mixin(`writeln("Hello World!");`); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生結(jié)果如下:
Hello World!
這里是另一個例子,我們可以通過在字符串中的編譯時間,以便混合類型可以使用函數(shù)來重用代碼。它如下所示。
import std.stdio; string print(string s) { return `writeln("` ~ s ~ `");`; } void main() { mixin (print("str1")); mixin (print("str2")); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生結(jié)果如下:
str1 str2
D語言模板定義通用的代碼模式,讓編譯器來生成該模式的實際情況。模板可以生成功能,結(jié)構(gòu),聯(lián)合,類,接口,以及任何其他合法D代碼。模板混合類型的語法如下所示。
mixin a_template!(template_parameters)
一個簡單的例子字符串混合類型如下所示,我們創(chuàng)建一個類系和一個混合類型實例化一個模板一個模板,從而使得該功能的setName和printNames可用的結(jié)構(gòu)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(); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生結(jié)果如下:
The names 0 : name1 1 : name2
混入的名稱空間是用來避免在模板中混合類型含糊不清。例如,可以有兩個變量,一個在主顯式定義,而另一個是混合的。當(dāng)混合在名稱相同的名稱是在周邊范圍內(nèi),則認(rèn)為是在周圍范圍的名稱得到使用。這個例子顯示如下。
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(); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生結(jié)果如下:
name 1 name 2