`
- 浏览:
220968 次
- 性别:
- 来自:
北京
-
(本章无版本差异)
一个 模板混入 指的是从一个 模版声明 的过程体内 提取一个任意的声明 集合,并将它们插
入到当前的上下文中。
模板混入:
mixin 模板标识符 ;
mixin 模板标识符 混入标识符 ;
mixin 模板标识符 !(模板参数列表 ) ;
mixin 模板标识符 !(模板参数列表 ) 混入标识符 ;
混入标识符:
标识符
模版混入 可以出现在模块、类、结构、联合的声明列表中,并且可以做为语句。模板标识
符 是一个 模版声明。如果 模版声明 没有参数,就可以使用不带 !(模版参数列表) 的混入
形式。
不像模板具现化,模板混入的过程体在混入 所在的作用域内 计算,而不是在定义模板声明的
地方。
这类似于使用剪切和粘贴将模版的过程体插入混入的位置。这对注入参数化的‘样板
文件’是有用的,同时对创建模板化 嵌套函数 也很有用,而正常情况下是不可能具 现化嵌套函数的。
template Foo()
{
int x = 5;
}
mixin Foo;
struct Bar
{
mixin Foo;
}
void test()
{
writefln("x = %d", x); // 输出 5
{ Bar b;
int x = 3;
writefln("b.x = %d", b.x); // 输出 5
writefln("x = %d", x); // 输出 3
{
mixin Foo;
writefln("x = %d", x); // 输出 5
x = 4;
writefln("x = %d", x); // 输出 4
}
writefln("x = %d", x); // 输出 3
}
writefln("x = %d", x); // 输出 5
}
混入可以被参数化:
template Foo(T)
{
T x = 5;
}
mixin Foo!(int); // 创建类型为 int 的 x
混入可以可以为类添加虚函数:
template Foo()
{
void func() { writefln("Foo.func()"); }
}
class Bar
{
mixin Foo;
}
class Code : Bar
{
void func() { writefln("Code.func()"); }
}
void test()
{
Bar b = new Bar();
b.func(); // 调用 Foo.func()
b = new Code();
b.func(); // 调用 Code.func()
}
混入在它们出现的地方被求值,而不是在模板声明的地方:
int y = 3;
template Foo()
{
int abc() { return y; }
}
void test()
{
int y = 8;
mixin Foo; // 使用的是局部的 y ,而不是全局的 y
assert(abc() ==;
}
混入可以使用别名参数来参数化符号:
template Foo(alias b)
{
int abc() { return b; }
}
void test()
{
int y = 8;
mixin Foo!(y);
assert(abc() ==;
}
这个例子使用了一个混入来为任意语句实现一个泛型 Duff's Device(在这里,那个语句采用粗体表示)。在生成一个嵌套函数的同时也生成了一个委托文字量,他们会通过编译器内
联:
template duffs_device(alias id1, alias id2, alias s)
{
void duff_loop()
{
if (id1 < id2)
{
typeof(id1) n = (id2 - id1 + 7) / 8;
switch ((id2 - id1) %
{
case 0: do { s();
case 7: s();
case 6: s();
case 5: s();
case 4: s();
case 3: s();
case 2: s();
case 1: s();
} while (--n > 0);
}
}
}
}
void foo() { writefln("foo"); }
void test()
{
int i = 1;
int j = 11;
mixin duffs_device!(i, j, delegate { foo(); } );
duff_loop(); // 执行 foo() 10 次
}
18.1 混入作用域
混入中的声明被‘导入’到周围的作用域中。如果混入和其周围的作用域中有相同的名字,
周围的作用域中的声明将覆盖混入中的那个声明:
int x = 3;
template Foo()
{
int x = 5;
int y = 5;
}
mixin Foo;
int y = 3;
void test()
{
writefln("x = %d", x); // 输出 3
writefln("y = %d", y); // 输出 3
}
如果两个不同的混入被放入同一个作用域,并且他们中定义了同名的声明,就会出现模棱两
可的错误:
template Foo()
{
int x = 5;
void func(int x) { }
}
template Bar()
{
int x = 4;
void func() { }
}
mixin Foo;
mixin Bar;
void test()
{
writefln("x = %d", x); // 错误,x 有歧义
func(); // 错误,func 有歧义
}
对 func() 的调用有歧义,因为 Foo.func 和 Bar.func 在不同的作用域里。
如果一个混入有 混入标识符,它就可以用来消除歧义:
int x = 6;
template Foo()
{
int x = 5;
int y = 7;
void func() { }
}
template Bar()
{
int x = 4;
void func() { }
}
mixin Foo F;
mixin Bar B;
void test()
{
writefln("y = %d", y); // 输出 7
writefln("x = %d", x); // 输出 6
writefln("F.x = %d", F.x); // 输出 5
writefln("B.x = %d", B.x); // 输出 4
F.func(); // 调用 Foo.func
B.func(); // 调用 Bar.func
}
别名声明可以被用来将声明在不同混入里的函数重载在一起:
template Foo()
{
void func(int x) { }
}
template Bar()
{
void func() { }
}
mixin Foo!() F;
mixin Bar!() B;
alias F.func func;
alias B.func func;
void main()
{
func(); // 调用 B.func
func(1); // 调用 F.func
}
一个混入有它自己的作用域,即使一个声明被另一个封闭的声明所重写也一样:
int x = 4;
template Foo()
{
int x = 5;
int bar() { return x; }
}
mixin Foo;
void test()
{
writefln("x = %d", x); // 输出 4
writefln("bar() = %d", bar()); // 输出 5
}
。。。。。。。。。。。。。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
2. **完善食品安全管理制度**: - 建立食品卫生安全档案,记录所售食品的留样情况。 - 维护食堂环境清洁,防止害虫滋生,确保食品加工环境的卫生。 - 生熟食品和成品、半成品分开存放,避免交叉污染。 - 实行索...
该文档是关于“餐厨垃圾收运处置协议”的合同模板,主要目的是规范餐饮行业的餐厨垃圾管理,确保垃圾得到无害化处理和资源利用,防止废弃食用油脂流入食物链。以下是对合同内容的详细说明: 1. **名词定义**: - ...
2. 自定义选项的混入策略 Vue允许开发者通过optionMergeStrategies来自定义选项的合并策略,这在使用Vue.extend扩展Vue构造器时非常有用。 3. Vue实例的生命周期钩子 在Vue实例或组件的生命周期钩子内部发生错误时...
2. **CSS样式**:CSS(Cascading Style Sheets)文件用于定义网页的布局和视觉样式。通常会有主CSS文件,用于全局样式,以及针对特定页面或组件的CSS文件。 3. **JavaScript**:JavaScript是实现网页动态效果的关键...
莫兰迪色系的特点是色彩温和、低调,不刺眼,通过将颜色混入一定的灰色,使得色彩之间产生微妙的平衡感。在PPT设计中,运用这种色系可以创造出优雅、专业的氛围,适合商业报告、学术演讲等正式场合。例如,模板中的...
19-Mixin混入
19-Mixin混入
对于希望迁移到Vue.js的开发者,教程也提供了从其他框架(如Ember、Knockout、Polymer、Riot、React、AngularJS)迁移过来的指南,以及如何处理Vue 1.x到Vue 2.x的迁移过程中的常见问题。 最后,教程还介绍了如何将...
【标题】"简约风毕业论文答辩(2)PPT模板共15页.pdf.zip" 提供的是一款设计简洁、风格明快的毕业论文答辩PPT模板,共有15页内容,适合于展示和阐述学术成果。 【描述】"简约风毕业论文答辩(2)PPT模板共15页.pdf.zip...
2. 节日PPT模板:节日PPT模板是指制作PPT时所需的模板,这些模板可以是各种节日的主题,如万圣节、圣诞节、元旦节等。 3. PPT素材下载:PPT素材下载是指下载各种PPT素材,如图片、图表、背景图片等,以便在制作PPT...
例如,报告中提到的混料问题,即在PP PM20E-2黑色原料中混入了其他白色胶粒,不良率为100%,影响了产品质量。 2. D2: 创建团队 组建一个跨职能的团队,包含不同领域的专家,如郑XX、王XX等,以确保全面解决问题。...
`vue.global.js` 文件是 Vue.js 框架的核心文件之...4. 全局混入:使用 `Vue.mixin` 可以在所有组件中混入指定的选项。 5. 全局过滤器:使用 `Vue.filter` 可以定义全局过滤器。 6. 全局插件:使用 `Vue.use` 可以注册
3. 物理污染:异物如玻璃碎片、金属丝等混入食品中,可能引发伤害。 4. 食品欺诈:假冒伪劣产品、虚假标识等现象影响食品安全和消费者权益。 四、食品安全控制措施 1. 加强源头管理:确保原料安全,严格执行农产品...
3. **物理污染**:探讨异物混入食品的可能性及防范措施。 **健康食物选择** 1. **营养均衡**:讲解食物金字塔,强调蛋白质、碳水化合物、脂肪、维生素和矿物质的平衡摄入。 2. **有机食品**:对比有机食品与常规...
2. **预定义样式**:Bootstrap提供了一套完整的CSS样式,包括字体、颜色、间距、按钮、表单、表格、图像、导航等,极大地简化了前端开发工作。 3. **组件库**:Bootstrap包含各种可复用的组件,如导航条(navbar)...
2. **预定义组件**:包括导航栏、按钮、表单、卡片、模态框、轮播图等丰富的UI组件,大大简化了网页构建过程,使得开发者可以快速创建出专业级别的界面。 3. **自定义**:Bootstrap5提供了丰富的SASS变量和混入...
以下是对这份合同模板的详细解读: 1. **委托方式**:合同明确了委托加工的方式,即甲方提供原料(酒糟),乙方提取糟烧酒精,而剩余的干糟则由乙方自行处理。同时,如果甲方生产发生变化,需提前通知乙方。 2. **...
这份标准的食品委托加工合同模板详细列出了双方的权利和义务,确保了合作的公平和透明。 **合同主要条款** 1. **订单流程**:委托方需提前x天通过传真给出订单数量,加工方在收到订单后需在指定时间内确认。订单...
2. **法国酿造工艺**:法国作为葡萄酒的重要产区,其酿造工艺闻名于世。通过多道复杂的酿造程序,如精心挑选葡萄、精确控制比例以及严格的窖藏过程,使得红酒的口感更加醇厚。 3. **口感升级**:红酒的口感提升得益...