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