D 语言 - 混合
混合是允许将生成的代码混合到源代码中的结构。 混合可以是以下类型 −
- 字符串混合
- 模板混合
- 混合名称空间
字符串混合
D 能够将代码作为字符串插入,只要该字符串在编译时已知。 字符串混合的语法如下所示−
mixin (compile_time_generated_string)
示例
下面显示了字符串混合的简单示例。
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
模板混合
D 模板定义了通用代码模式,以便编译器从该模式生成实际实例。 模板可以生成函数、结构、联合、类、接口和任何其他合法的 D 代码。 模板混合的语法如下所示。
mixin a_template!(template_parameters)
下面显示了字符串混合的一个简单示例,其中我们创建一个包含类 Department 的模板和一个实例化模板的混合,从而使函数 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 中出现歧义。 例如,可以有两个变量,一个在 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

