- D 编程基础
- D 编程 - 首页
- D 编程 - 概述
- D 编程 - 环境
- D 编程 - 基本语法
- D 编程 - 变量
- D 编程 - 数据类型
- D 编程 - 枚举
- D 编程 - 字面量
- D 编程 - 运算符
- D 编程 - 循环
- D 编程 - 条件语句
- D 编程 - 函数
- D 编程 - 字符
- D 编程 - 字符串
- D 编程 - 数组
- D 编程 - 关联数组
- D 编程 - 指针
- D 编程 - 元组
- D 编程 - 结构体
- D 编程 - 联合体
- D 编程 - 范围
- D 编程 - 别名
- D 编程 - Mixin
- D 编程 - 模块
- D 编程 - 模板
- D 编程 - 不可变对象
- D 编程 - 文件 I/O
- D 编程 - 并发
- D 编程 - 异常处理
- D 编程 - 合约
- D - 条件编译
- D 编程 - 面向对象
- D 编程 - 类与对象
- D 编程 - 继承
- D 编程 - 重载
- D 编程 - 封装
- D 编程 - 接口
- D 编程 - 抽象类
- D 编程 - 有用资源
- D 编程 - 快速指南
- D 编程 - 有用资源
- D 编程 - 讨论
D 编程 - Mixin
Mixin 是允许将生成的代码混合到源代码中的结构体。Mixin 可以是以下类型:
- 字符串 Mixin
- 模板 Mixin
- Mixin 命名空间
字符串 Mixin
D 具有在编译时插入字符串代码的能力,只要该字符串在编译时已知。字符串 Mixin 的语法如下所示:
mixin (compile_time_generated_string)
示例
下面显示了一个字符串 Mixin 的简单示例。
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
模板 Mixin
D 模板定义了通用的代码模式,编译器可以根据该模式生成实际的实例。模板可以生成函数、结构体、联合体、类、接口以及任何其他合法的 D 代码。模板 Mixin 的语法如下所示。
mixin a_template!(template_parameters)
下面显示了一个字符串 Mixin 的简单示例,我们使用类 Department 创建一个模板,并使用一个 Mixin 实例化该模板,从而使函数 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 命名空间
Mixin 命名空间用于避免模板 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
广告