📅  最后修改于: 2020-11-04 05:15:38             🧑  作者: Mango
Mixins是允许将生成的代码混合到源代码中的结构。 Mixins可以是以下类型-
只要在编译时就知道该字符串, 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的语法如下所示。
mixin a_template!(template_parameters)
下面显示了一个简单的字符串mixin示例,我们在其中创建一个类为Department的模板,并实例化一个mixin的模板,从而使setName和printNames函数可用于结构学院。
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
混入名称空间用于避免模板混入中的歧义。例如,可以有两个变量,一个在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