- D 编程基础
- D 编程 - 主页
- D 编程 - 概述
- D 编程 - 环境
- D 编程 - 基本语法
- D 编程 - 变量
- D 编程 - 数据类型
- D 编程 - 枚举
- D 编程 - 文字
- D 编程 - 运算符
- D 编程 - 循环
- D 编程 - 决策
- D 编程 - 函数
- D 编程 - 字符
- D 编程 - 字符串
- D 编程 - 数组
- D 编程 - 关联数组
- D 编程 - 指针
- D 编程 - 元组
- D 编程 - 结构
- D 编程 - 联合
- D 编程 - 范围
- D 编程 - 别名
- D 编程 - Mixins
- D 编程 - 模块
- D 编程 - 模板
- D 编程 - 不可变
- D 编程 - 文件 I/O
- D 编程 - 并发
- D 编程 - 异常处理
- D 编程 - 合同
- D - 条件编译
- D 编程 - 面向对象
- D 编程 - 类和对象
- D 编程 - 继承
- D 编程 - 重载
- D 编程 - 封装
- D 编程 - 接口
- D 编程 - 抽象类
- D 编程 - 有用的资源
- D 编程 - 快速指南
- D 编程 - 有用的资源
- D 编程 - 讨论
D 编程 - Mixins
Mixin 是允许将生成的代码混合到源代码中的结构。Mixin 可以是以下类型 -
- 字符串混合
- 模板混入
- 混合命名空间
字符串混合
D 能够将代码作为字符串插入,只要该字符串在编译时已知。字符串 mixin 的语法如下所示 -
mixin (compile_time_generated_string)
例子
下面显示了字符串 mixin 的一个简单示例。
import std.stdio; void main() { mixin(`writeln("Hello World!");`); }
当上面的代码被编译并执行时,它会产生以下结果 -
Hello World!
这是另一个例子,我们可以在编译时传递字符串,以便 mixins 可以使用这些函数来重用代码。如下所示。
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 可用于结构 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 中出现歧义。例如,可以有两个变量,一个在 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