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